21

MySQL でプロシージャを作成しようとすると、次のエラーが発生します。

Error Code: 1337
Variable or condition declaration after cursor or handler declaration

多くのグーグルを行った後でも、私の問題に関連する解決策は見つかりませんでした。私の手順は次のとおりです。

DELIMITER //
CREATE PROCEDURE emp_dates(IN startDate DATE, IN endDate DATE)
BEGIN
DECLARE fromDt DATETIME;
DECLARE toDt DATETIME;
DECLARE done INT DEFAULT FALSE;
DECLARE employees CURSOR FOR SELECT empid FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
DECLARE emp VARCHAR(20);
SET fromDt=startDate;
SET toDt=endDate;

OPEN employees;

WHILE fromDt<=toDt DO
REPEAT
    FETCH employees INTO emp;
    IF NOT done THEN
    INSERT INTO new_attendance_2(attid,empid,dt) VALUES(DEFAULT,emp,fromDt);
    END IF
UNTIL done END REPEAT;
SET fromDt=DATE_ADD(fromDt, INTERVAL 1 DAY);
LOOP
CLOSE employees;
END
DELIMITER ;

目的は、入力として 2 つの日付を取り、それら 2 つの間のすべての日について他のテーブルにレコードを挿入するプロシージャを作成することです。誰か助けてください!少しでも助けていただければ幸いです。よろしくお願いします。

4

2 に答える 2

27

それは不平を言っています:

Variable or condition declaration after cursor or handler declaration

したがって、カーソルとハンドラーの後に実際に変数を宣言する場所を確認します。

   DECLARE employees CURSOR FOR SELECT empid FROM employees;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
>> DECLARE emp VARCHAR(20);

このように宣言を変更しても問題ありません。

DECLARE fromDt DATETIME;
DECLARE toDt DATETIME;
DECLARE done INT DEFAULT FALSE;
DECLARE emp VARCHAR(20);

DECLARE employees CURSOR FOR SELECT empid FROM employees;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;

順序は、次のようにする必要があります

カーソル宣言は、ハンドラー宣言の前、および変数と条件の宣言の後に指定する必要があります。

于 2013-09-13T07:55:43.337 に答える
4

宣言の順序を変更する必要があります。

Cursor declarations must appear before handler declarations 
and after variable and condition declarations.

http://dev.mysql.com/doc/refman/5.1/en/cursors.html

于 2013-09-13T07:55:15.183 に答える