2013-01-20 86 views
6

我不明白爲什麼即時通訊下我的sp代碼語法錯誤。任何人都可以幫我解決這個問題嗎?DECLARE CURSOR語法錯誤

SQL錯誤(1064):

你有一個錯誤的SQL語法;檢查手冊中 對應於你的MySQL服務器版本正確的語法在第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..兩列向上移動即可。

有時你想在代碼中稍後聲明一個變量或光標,例如,如果滿足條件。

在這種情況下,您可以再次使用嵌套的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是的,但是爲什麼說'YEAH'如果你意思是'yeah' :)會在另一個地方造成麻煩 –

1

使用 附近「聲明CUR1 CURSOR FOR SELECT pc.prospectus_courses_id FROM prereq_cou」有沒有必要分號?

WHERE ps.id = to_search; 
         ^___________ 
+0

它得到相同的錯誤:) – tatskie