2015-05-04 13 views
7

Ten kod przeszedł kilka testów sprawdzania poprawności online. Nie wiem, co jest nie tak. Po funkcji CONCAT jest napisane, że potrzebuję średnika, chociaż już tam jest. I na end mówi, że jest to wejście dodatkowe, gdy oczekuje końca instrukcji. Co daje?Dlaczego MySQL Workbench mówi mi, że potrzebuję średnika

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

używacie phpMyAdmin ustawić tę procedurę przechowywaną? – Alex

+0

Nie, działam w środowisku MySQL Workbench, bezpośrednio w oknie zapytania. – Indigenuity

+0

czy próbowałeś mojej odpowiedzi? – Alex

Odpowiedz

15

Myślę, że problem jest: nie używasz DELIMITER.

Więc wystarczy umieścić go w ten sposób:

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

W przypadku korzystania z programu klienta mysql zdefiniować zapisany program zawierający znaki średnik, pojawia się problem. Domyślnie mysql sam rozpoznaje średnik jako ogranicznik instrukcji, więc musisz tymczasowo zdefiniować ogranicznik, aby mysql przesłał całą definicję przechowywanego programu do serwera.

Aby ponownie zdefiniować ogranicznik mysql, użyj polecenia separatora. Poniższy przykład pokazuje, jak to zrobić dla właśnie pokazanej procedury dorepeat(). Ogranicznik zostaje zmieniony na //, aby umożliwić przekazanie całej definicji do serwera jako pojedynczej instrukcji, a następnie przywrócono; przed wywołaniem procedury. Umożliwia to; Separator używany w treści procedury do przekazania do serwera , a nie interpretowany przez samą mysql.

+1

Nie jestem całkiem pewien, co dokładnie się zmieniło, ale to sprawiło, że wszystko działało. Ale musiałem usunąć ostatni "DELIMITER". Podawano "nieznane dane wejściowe znalezione" – Indigenuity

+0

tak, masz powód, powinieneś tam dodać średnik. sprawdź moją aktualizację. – Alex

+1

Pomiędzy ostatnim DELIMITER a średnikiem pojawiła się dodatkowa przestrzeń. DELIMITER; – VK321

2

Problem jest ogranicznikiem, powinieneś zmienić ogranicznik. Miałem ten sam problem i zmiana ogranicznika rozwiązała problem. Patrz rozdział "Odpowiedź na żądanie".

Oto proste wyjaśnienie, cytując dokumentacji MySQL:

Przykład używa polecenia mysql klient ogranicznika zmienić separator oświadczenie; do // podczas definiowania procedury. Umożliwia to; ogranicznik używany w treści procedury do przekazania do serwera, zamiast interpretowany przez sam mysql. Patrz rozdział 22.1, "Definiowanie zapisanych programów".

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. 
Powiązane problemy