2009-03-12 2 views
6

ho difficoltà a individuare un errore quando si tenta di creare una stored procedure in mysql.Errore di sintassi SQL durante la creazione di una stored procedure in MYSQL

se eseguo ogni singola riga della procedura in modo indipendente, tutto funziona perfettamente.

CREATE PROCEDURE cms_proc_add_child (param_parent_id INT, param_name CHAR(255), param_content_type CHAR(255)) 
BEGIN 
    SELECT @child_left := rgt FROM cms_tree WHERE id = param_parent_id; 
    UPDATE cms_tree SET rgt = rgt+2 WHERE rgt >= @child_left; 
    UPDATE cms_tree SET lft = lft+2 WHERE lft >= @child_left; 
    INSERT INTO cms_tree (name, lft, rgt, content_type) VALUES (param_name, @child_left, @child_left+1, param_content_type); 
END 

ottengo il seguente (utile) di errore: ERROR 1064 (42000): Hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino a '' alla riga 3 ... non so da dove iniziare il debug, poiché ogni singola di queste linee è corretta.

qualche consiglio?

risposta

20

Come la riga 3 contiene il primo ; forse si ha un problema con i delimitatori.

vedere http://dev.mysql.com/doc/refman/5.0/en/stored-programs-defining.html

 
mysql> delimiter // 

mysql> CREATE PROCEDURE dorepeat(p1 INT) 
    -> BEGIN 
    -> SET @x = 0; 
    -> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; 
    -> END 
    -> // 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 
1

Non si dichiara mai la variabile @child_left.

1

Grazie, vicino '' at line 3 era il mio problema e la dichiarazione delimitatore riparato! Voglio sempre che le cose abbiano un senso e questo sì. Poiché "" indica che si trova alla fine della procedura, ma non è stata trovata alcuna istruzione END, quindi l'errore di sintassi. E mi sono chiesto perché continuavo a vedere un sacco di persone usando la dichiarazione del delimitatore. Vedo la luce!