8

以下のspコードで構文エラーが発生する理由がわかりません。誰かが私がこれを理解するのを手伝ってもらえますか?

SQLエラー(1064):

SQL構文にエラーがあります。8行目の「DECLARECUR1CURSORFOR SELECT pc.prospectus_courses_id FROM prereq_cou」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

DELIMITER $$
DROP PROCEDURE IF EXISTS get_prereqs3$$
CREATE PROCEDURE get_prereqs3(IN prosp_courses_id SMALLINT(5))
BEGIN
    DECLARE done  int DEFAULT FALSE;
    DECLARE required SMALLINT(5) default 0; 
    DECLARE to_search SMALLINT(5) default 0; 
    DROP TABLE IF EXISTS tmp_list;
    CREATE TABLE tmp_list(courses_id SMALLINT(5), courses_id_req SMALLINT(5)) ENGINE = MEMORY;
    DECLARE CUR1 CURSOR FOR SELECT pc.prospectus_courses_id 
            FROM prereq_courses     pc          
            JOIN prerequisites      pr on (pr.id = pc.prerequisites_id)
            JOIN prospectus_courses ps on (ps.id = pr.prospectus_courses_id)
            WHERE ps.id = to_search 
    MAIN_LOOP: LOOP 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        OPEN cur1;
        FETCH cur1 INTO required;

        IF done THEN
            CLOSE cur1;
            LEAVE main_loop;
        ELSE
            insert into tmp_list values (to_search, required);
            set to_search = required;
            iterate main_loop;
        END IF;
    END LOOP;
    select  c.course_code 
        from tmp_list           t
        join prospectus_courses pc on pc.id = t.courses_id_req
        join courses            c  on c.id  = pc.courses_id ;
    drop table tmp_list;
END$$
DELIMITER ;
4

2 に答える 2

25

BEGIN宣言はブロックの直後に行う必要があります。あなたの場合は、DECLARE cur1 CURSORDECLARE CONTINUE HANDLER..2行を上に移動するだけです。

条件が満たされた場合など、コードの後半で変数またはカーソルを宣言したい場合があります。

この場合、ブロックをBEGIN .. END再度ネストしてラップすることができます。

http://dev.mysql.com/doc/refman/5.5/en/begin-end.htmlおよび http://dev.mysql.com/doc/refman/5.5/en/declare.html

DECLARE複合ステートメント内でのみ許可されBEGIN ... END、他のステートメントの前に開始する必要があります。

また、宣言していますがCUR1、を使用していcur1ます。

于 2013-01-20T09:59:20.093 に答える
1

セミコロンは必要ありませんか?

WHERE ps.id = to_search;
                       ^___________
于 2013-01-20T09:52:58.733 に答える