2013-01-20 33 views
6

下記の私のspコードで構文エラーが発生する理由を理解していません。誰も私がこれを理解するのを助けることができますか?DECLARE CURSORの構文エラー

SQLエラー(1064):

あなたのSQL構文でエラーが発生しています。 が必要にセミコロンがないライン8

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 ; 

答えて

17

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

条件が満たされている場合にのみ、変数やカーソルをコードの後ろに宣言したい場合があります。

この場合、ブロックを入れ子にしてBEGIN .. ENDに再度ラップすることができます。

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

DECLAREのみBEGIN ... END複合文内で許可され、他の文の前に、その先頭でなければなりません。

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

+0

それを得ました@Michel、あなたは天才です、ありがとう! – tatskie

+1

[ローカル変数名では大文字と小文字は区別されません。](http://dev.mysql.com/doc/en/declare-local-variable.html) – eggyal

+0

@eggy +1ええ、 「ええ」とは別の場所でトラブルを引き起こす –

1

で が近い「 prereq_cou FROM SELECT pc.prospectus_courses_id FOR CUR1 CURSORを宣言」を使用する権利構文についてはMySQLサーバのバージョンに対応していること取扱説明書を確認してください?

WHERE ps.id = to_search; 
         ^___________ 
+0

それは同じエラーを取得します:) – tatskie