MySQL存储过程:调用循环

时间:2016-01-05 14:10:13

标签: mysql loops cursor case

我是MySQL存储过程的新手。我正在编写一个包含组合或游标和CASE的代码。

我在游标中有一个带标签的循环。是否可以在我的CASE条件中调用带标记的循环

编辑:

DROP PROCEDURE IF EXISTS ETOOLS_LATEST.SP_QueryTermsAndConditions;

COMMIT;

DELIMITER $$
CREATE PROCEDURE ETOOLS_LATEST.SP_QueryTermsAndConditions (
   IN P_IN_ACCEPTED_BY VARCHAR(32),
    OUT P_OUT_ACCEPTED_VERSION VARCHAR(10),
    OUT P_OUT_CATEGORY VARCHAR(20),
   OUT P_OUT_CURRENT_VERSION VARCHAR(10),
   OUT P_OUT_FORCE_ACCEPT BOOLEAN
   )
BEGIN
    DECLARE noMoreRows BOOLEAN;
    DECLARE loopCounter INT DEFAULT 0;
    DECLARE rowCount INT DEFAULT 0;

    DECLARE acceptedVersion INT(10);
    DECLARE currentVersion INT(10);
    DECLARE latestGeneral VARCHAR(10);
    DECLARE latestBooking VARCHAR(10);

    DECLARE curTnc CURSOR
    FOR

   SELECT a.version AS accepted_version,
        a.category,
        (
            SELECT version
            FROM apptermsandconditions c
            WHERE is_latest IS True
                AND c.category = a.category
            ) AS current_version
    FROM ETOOLS_LATEST.apptermsandconditions a,
        ETOOLS_LATEST.usertermsandconditions b
    WHERE b.accepted_version = a.id
        AND b.accepted_by = P_IN_ACCEPTED_BY;

    DECLARE
    CONTINUE HANDLER
    FOR NOT FOUND
    SET noMoreRows = TRUE;

    SELECT VERSION
    INTO latestGeneral
    FROM ETOOLS_LATEST.AppTermsAndConditions
    WHERE is_latest IS TRUE
        AND CATEGORY = 'General';

    SELECT VERSION
    INTO latestBooking
    FROM ETOOLS_LATEST.AppTermsAndConditions
    WHERE is_latest IS TRUE
        AND CATEGORY = 'Booking';

    OPEN curTnc;

    SELECT FOUND_ROWS()
    INTO rowCount;

    cursorLoop: LOOP

    FETCH curTnc
    INTO P_OUT_ACCEPTED_VERSION,
        P_OUT_CATEGORY,
        P_OUT_CURRENT_VERSION;

    IF noMoreRows THEN
        CLOSE curTnc;
        LEAVE cursorLoop;
    END IF;

    IF P_OUT_ACCEPTED_VERSION <> P_OUT_CURRENT_VERSION THEN
        SET P_OUT_FORCE_ACCEPT = 1;
    ELSE
        SET P_OUT_FORCE_ACCEPT = 0;
    END IF;

    SELECT P_OUT_ACCEPTED_VERSION,
        P_OUT_CATEGORY,
        P_OUT_CURRENT_VERSION,
        P_OUT_FORCE_ACCEPT;

    SET loopCounter = loopCounter + 1;

    END LOOP cursorLoop;

    CASE rowCount
        WHEN 0
            THEN
                SELECT null, 'General', latestGeneral, 1;
                SELECT null, 'Booking', latestBooking, 1;
        WHEN 1
            THEN
                CASE P_OUT_CATEGORY
                    WHEN 'General'
                        THEN
                            SELECT null, 'Booking', latestBooking, 1;
                    WHEN 'Booking'
                        THEN
                            SELECT null, 'General', latestGeneral, 1;
                END CASE;
        WHEN 2
            THEN
                SELECT null;
    END CASE;

END $$

DELIMITER ;


CALL SP_QueryTermsAndConditions('333333', @P_OUT_ACCEPTED_VERSION, @P_OUT_CATEGORY, @P_OUT_CURRENT_VERSION, @P_OUT_FORCE_ACCEPT);

0 个答案:

没有答案