6

マルチタスクを実行できるストア プロシージャを作成したいと考えています。その後、以下のエラーメッセージが表示されました

Error Code: 1338 Cursor declaration after handler declaration

私のストア手順を見てください

CREATE PROCEDURE `spTest`(OUT v1 VARCHAR(500), OUT v2 VARCHAR(500))
BEGIN

    DECLARE  _cur_1 CURSOR FOR
        SELECT id
        FROM tbl_1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _cur1Done = 1;

    DECLARE  _cur_2 CURSOR FOR
        SELECT id
        FROM tbl_2;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _cur2Done = 1;

    .......
4

2 に答える 2

6

continue handlerブロック内でアクティブにできるのは 1 つだけです。宣言の順序が正しい場合でも、複数continue handlerの場合に問題が発生します(最初にすべてのカーソル、次にハンドラー)。Duplicate handler declared in same block

カーソルのアクセス専用のブロックを作成することで、これを回避できます。これらのコードのチャンクは、同じ親ブロック、ネストされたループ、またはどこにでも配置できます。

DELIMITER $$
CREATE PROCEDURE `spTest`(OUT v1 VARCHAR(500), OUT v2 VARCHAR(500))
BEGIN

    declare tbl_1_id int;
    declare tbl_2_id int;

    declare _cur1Done boolean default false;
    declare _cur2Done boolean default false;

    DECLARE  _cur_1 CURSOR FOR SELECT id FROM tbl_1;
    DECLARE  _cur_2 CURSOR FOR SELECT id FROM tbl_2;

    begin -- dedicated block to fetch from cursor 1 and update its flag
        declare continue handler for not found set _cur1Done = TRUE;
        fetch _cur_1 into tbl_1_id;
    end;

    begin -- dedicated block to fetch from cursor 2 and update its flag
        declare continue handler for not found set _cur2Done = TRUE;
        fetch _cur_2 into tbl_2_id;
    end;
END $$
DELIMITER ;
于 2015-10-29T16:12:14.543 に答える