0

そのようにしようとしましたが、1行しか返されません。最初の選択の後、プロシージャは終了します。

DROP PROCEDURE IF EXISTS testProc;
DELIMITER $$
    CREATE PROCEDURE testProc(start_stamp INT, end_stamp INT, step INT)
    BEGIN
        DECLARE tmpStep INT;
        SET tmpStep = start_stamp;
        WHILE tmpStep < end_stamp DO
            SELECT tmpStep;
            SET tmpStep = tmpStep + step;
        END WHILE;
    END$$
DELIMITER ;

CALL testProc (1,10,1);

この場合、望ましい動作は 1 から 10 までの数値を返すことです。

4

1 に答える 1

1

動的に生成された結果セットを返すプロシージャを作成するには、一時テーブルを内部で作成してから選択する必要があります。次のコードはあなたのために仕事をするはずです:

DROP PROCEDURE IF EXISTS testProc;
DELIMITER $$
CREATE PROCEDURE testProc(start_stamp INT, end_stamp INT, step INT)
BEGIN
    DECLARE tmpStep INT;
    DROP TABLE IF EXISTS `testProc$tmp`;
    CREATE TEMPORARY TABLE `testProc$tmp` (a INT);
    SET tmpStep = start_stamp;
    WHILE tmpStep < end_stamp DO
        INSERT INTO `testProc$tmp` VALUES(tmpStep);
        SET tmpStep = tmpStep + step;
    END WHILE;
    SELECT * FROM `testProc$tmp`;
END$$
DELIMITER ;

CALL testProc (1,10,1);

このコードは、関数呼び出し後に一時テーブルをぶら下げたままにしますが、他のテーブルと衝突しないように名前が「あいまい」になるように作成されていることに注意してください。

于 2013-10-31T14:33:01.933 に答える