«

»

Lug 07

MySQL e procedure

mysqlContinuo la serie di piccoli accorgimenti che possono far risparmiare molto tempo. Stavolta il DBMS di cui parlo è Oracle MySQL (ormai si chiama così).

Il problema davanti al quale mi sono trovato era la creazione di una procedura memorizzata (o stored procedure) in cui il parser MyQL mi segnalava un errore che in realtà non esisteva, perché il problema era un altro.

Riporto uno snippet della procedura:

 

delimiter $$

CREATE PROCEDURE `sp_order_take`(
 in i_ddt_id int,
out o_id int,
 out o_err char
)
BEGIN 
 declare w_status_id int;
 declare w_id int;

 select status_id into w_status_id
 from table1
 where ddt_id = i_ddt_id;
 
...

 if w_status_id = 2 then
   set o_err := 'Ordine gia preso in carico';
   set o_id := null;
 else if w_status_id = 4 then
   set o_err := 'Ordine gia chiuso';
   set o_id := null;
 else
   select w_id into o_id;
 end if;

end$$

delimiter ;

Ora l’errore che mi veniva segnalato sia dal parser di MySQL Benchmark che dal server era del tipo:

ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL 
server version for the right syntax to use near '' at line 68

La linea 68 era la fine dello script.

Il problema non era collegato al cambiamento del delimitatore (che serve per non fare processare al server ogni riga come a sé stante, condizione che genererebbe circa un errore per riga) ma alla scrittura della struttura if… then… else; in particolare l’else if va scritto tutto di seguito elseif, oppure occorre aggiungere un ulteriore end if!

I problemi visti dopo sembrano sempre banali. Potenza del senno di poi. E delle fosse piene.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>