2

カーソルのループ内でMySQLのストアドプロシージャを呼び出そうとしています。ループ内でINSERTを実行すると、カーソルは正しく動作します。しかし、ストアドプロシージャを呼び出そうとすると、continueHandler'はdone=1'に設定され、最初のレコードが処理された後、ループを途中で終了します。これを回避する方法について何か考えはありますか?ありがとう。

declare test_cursor cursor for 
       select projectid, projectdesc
         from tblProjects
        order by projectdesc;          

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

set done = 0;  
open test_cursor;

repeat

  fetch test_cursor into wprojectid, wprojectdesc;

  if not done then  

    insert into tblTest (a, b) values (wprojectid, wprojectdesc);   <--this would work
    call spTest(wprojectid, wprojectdesc, @retrn);                                    <--this trips the Handler after first loop

  end if;      

until done end repeat;

close test_cursor; 
4

2 に答える 2

2

よくわかりませんが、このコードが機能するかどうかを確認してみてください。

declare test_cursor cursor for 
       select projectid, projectdesc
         from tblProjects
        order by projectdesc;          

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE done_holder INT;


set done = 0;
open test_cursor;

repeat

  fetch trade_cursor into wprojectid, wprojectdesc;

  if not done then  

    set done_holder = done;
    insert into tblTest (a, b) values wprojectid, wprojectdesc;
    call spTest(a, b, @retrn);
    set done = done_holder;

  end if;      

until done end repeat;

close test_cursor; 
于 2012-05-16T18:03:17.557 に答える
0

I think the problem is here - 'call spTest(a, b, @retrn);', try to change it with this one -

CALL spTest(wprojectid, wprojectdesc, @retrn);

so, your code can be like this -

  DECLARE done INT DEFAULT 0;
  DECLARE wprojectid, wprojectdesc  INT;
  DECLARE test_cursor CURSOR FOR SELECT projectid, projectdesc FROM tblProjects ORDER BY projectdesc;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  SET done = 0;
  OPEN test_cursor;

  REPEAT
  FETCH test_cursor INTO wprojectid, wprojectdesc;
    IF NOT done THEN
      INSERT INTO tblTest (a, b) VALUES (wprojectid, wprojectdesc);
      CALL spTest(wprojectid, wprojectdesc, @retrn);
    END IF;
  UNTIL done
  END REPEAT;
  CLOSE test_cursor;
于 2012-05-17T07:01:00.223 に答える