2015-05-04 9 views
7

Questo codice ha superato diversi test di convalida online. Non so cosa c'è che non va. Dopo la funzione CONCAT, dice che ho bisogno di un punto e virgola, anche se ce n'è già uno. E sul end dice che è un input estraneo quando si aspetta una fine dell'istruzione. Cosa dà?Perché MySQL Workbench mi dice che ho bisogno di un punto e virgola

create procedure AddColumnUnlessExists(
    IN dbName tinytext, 
    IN tableName tinytext, 
    IN fieldName tinytext, 
    IN fieldDef text) 
begin 
    IF NOT EXISTS (
     SELECT * FROM information_schema.COLUMNS 
     WHERE column_name=fieldName 
     and table_name=tableName 
     and table_schema=dbName 
     ) 
    THEN 
     set @ddl = CONCAT('ALTER TABLE ', dbName, '.', tableName, ' ADD COLUMN ', fieldName, ' ', fieldDef); 
     prepare stmt from @ddl; 
     execute stmt; 
    END IF; 
end; 
+0

si usa phpMyAdmin per impostare questa stored procedure? – Alex

+0

No, sto lavorando in MySQL Workbench, direttamente in una finestra di query. – Indigenuity

+0

hai provato la mia risposta? – Alex

risposta

15

Credo che il problema è: non si utilizza DELIMITER.

Così appena messo in questo modo:

DELIMITER // 
create procedure AddColumnUnlessExists(
    IN dbName tinytext, 
    IN tableName tinytext, 
    IN fieldName tinytext, 
    IN fieldDef text) 
begin 
    IF NOT EXISTS (
     SELECT * FROM information_schema.COLUMNS 
     WHERE column_name=fieldName 
     and table_name=tableName 
     and table_schema=dbName 
     ) 
    THEN 
     set @ddl = CONCAT('ALTER TABLE ', dbName, '.', tableName, ' ADD COLUMN ', fieldName, ' ', fieldDef); 
     prepare stmt from @ddl; 
     execute stmt; 
    END IF; 
end // 
DELIMITER ; 

EDIThttps://dev.mysql.com/doc/refman/5.7/en/stored-programs-defining.html

Se si utilizza il programma client mysql per definire un programma memorizzato contenente caratteri virgola, sorge un problema. Per impostazione predefinita, mysql riconosce il punto e virgola come delimitatore di istruzioni, pertanto è necessario ridefinire temporaneamente il delimitatore per far sì che mysql passi l'intera definizione di programma memorizzata al server.

Per ridefinire il delimitatore mysql, utilizzare il comando delimitatore. L'esempio seguente, , mostra come eseguire questa operazione per la procedura dorepeat() appena mostrata. Il delimitatore viene modificato in // per abilitare l'intera definizione da passare al server come singola istruzione e quindi a ripristinata; prima di invocare la procedura. Ciò abilita il; Il delimitatore utilizzato nel corpo della procedura da passare al server anziché essere interpretato da mysql stesso.

+1

Non so bene cosa sia cambiato esattamente, ma questo ha funzionato. Ma ho dovuto cancellare l'ultimo 'DELIMITER'. Stava dando "input estraneo trovato" – Indigenuity

+0

sì, hai un motivo, dovresti aggiungere punto e virgola lì. controlla il mio aggiornamento. – Alex

+1

Lo spazio aggiuntivo tra l'ultimo DELIMITER e il punto e virgola ha funzionato per me. DELIMITER; – VK321

2

Il problema è il delimitatore, è necessario modificare il delimitatore. Ho avuto lo stesso problema e la modifica del delimitatore ha risolto il problema. Fare riferimento a @Alex Risposta.

Ecco una spiegazione semplice, citando MySQL documentazione:

L'esempio utilizza il comando mysql cliente delimitatore di cambiare il delimitatore dichiarazione; a // durante la definizione della procedura. Ciò abilita il; delimitatore utilizzato nel corpo della procedura da passare al server anziché essere interpretato da mysql stesso. Vedere la Sezione 22.1, "Definizione dei programmi memorizzati".

https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

DELIMITER // 
create procedure some_procedure() 
# Do what you need here 

END // 

DELIMITER ; # change the delimiter back again. 
Problemi correlati