2013-01-20 8 views
6

Non capisco perché im ottenere errore di sintassi sul mio codice sp qui sotto. Qualcuno può aiutarmi a capirlo?Errore di sintassi su DECLARE CURSOR FOR

SQL Error (1064):

Hai un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi diritto di utilizzare vicino 'Declare cur1 CURSORE PER SELEZIONARE pc.prospectus_courses_id DA prereq_cou' at line 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 ; 

risposta

17

dichiarazioni devono essere subito dopo un blocco BEGIN. Nel tuo caso sposta semplicemente le linee DECLARE cur1 CURSOR e DECLARE CONTINUE HANDLER.. due.

A volte si desidera dichiarare una variabile o un cursore più avanti nel codice, ad esempio solo se viene soddisfatta una condizione.

In questo caso è possibile avvolgere nuovamente il blocco con uno BEGIN .. END nidificato.

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

DECLARE è consentito solo all'interno di una dichiarazione BEGIN ... END composto e deve essere al suo inizio, prima di qualsiasi altra dichiarazione.

Inoltre si dichiara CUR1 ma utilizzando cur1.

+0

capito @Michel, sei un genio, grazie! – tatskie

+1

[I nomi delle variabili locali non fanno distinzione tra maiuscole e minuscole.] (Http://dev.mysql.com/doc/en/declare-local-variable.html) – eggyal

+0

@eggy +1 Sì, vero, ma perché dire "YEAH" se si significa "sì" :) può causare problemi in un altro posto –

1

Non c'è bisogno e virgola?

WHERE ps.id = to_search; 
         ^___________ 
+0

si ottiene lo stesso errore :) – tatskie