Aby wyjaśnić terminologię:
SQL to zapytanie język używany do wybierania, aktualizowania, usuwania lub tworzenia danych w relacyjnej bazie danych. Nie zawiera elementów proceduralnych
jak pętle (FOR
, GDY
) lub instrukcje warunkowe (IF
, INNY
) lub zmienne lub kursory.
UTWÓRZ FUNKCJĘ
jest rzeczywiście „instrukcją SQL”, ale jest jedynie „opakowaniem” określającym blok kodu, który jest wykonywany przez coś innego niż zapytanie SQL „silnik”. Postgres (w przeciwieństwie do innych DBMS) obsługuje wiele "silników wykonawczych", które mogą wykonać blok kodu, który został przekazany do instrukcji "CREATE FUNCTION" - jednym z artefaktów jest to, że kod jest w rzeczywistości ciągiem, więc CREATE FUNCTION widzi tylko sznurek, nic więcej.
Ponieważ SQL nie zawiera elementów proceduralnych, nie można mieszać kodu proceduralnego z kodem SQL. Jeśli chcesz uruchomić kod proceduralny, musisz poinformować serwer, że w jakiś sposób przełączasz "silniki". Odbywa się to poprzez (SQL) DO
polecenie, które ponownie pobiera ciąg, z którym nie wie, co zrobić, wysyła go do serwera i mówi „tutaj jest fragment kodu, w którym użytkownik twierdził, że silnik 'xyz' może wykonać” - xyz to PL/pgSQL, Python, Perl lub coś zupełnie innego.
Jest to to samo, co anonimowy blok PL/SQL w Oracle, który zaczynasz od DECLARE
- wszystko po tym jest wykonywane przez inny silnik wykonawczy na serwerze. MySQL nie ma takiej funkcji. Jedynym sposobem na uruchomienie kodu proceduralnego jest utworzenie procedury (lub funkcji), a następnie jej uruchomienie. Dlatego nie ma czegoś takiego jak DO
w MySQL.
Jedynym produktem DBMS, który nie rozróżnia wyraźnie kodu proceduralnego od „zwykłego SQL”, jest SQL Server:T-SQL jest rozszerzeniem języka SQL, które pozwala mieszać „zwykły SQL” i proceduralny SQL bez informowania backendu, że kod potrzebuje innego silnika do uruchomienia (co jest źródłem wielkiego zamieszania dla osób migrujących z SQL Server do Postgres lub Oracle).
SQL/PSM to standard definiujący elementy proceduralne, które można osadzić w silniku bazy danych, który używa języka SQL jako języka zapytań. Nie znam żadnego produktu DBMS, który faktycznie implementuje SQL/PSM. Postgres' PL/pgSQL, Oracle PL/SQL, proceduralny dialekt MySQL są nieco podobne do tego, ale dalekie od zgodności ze standardem SQL/PSM. Myślę, że najbliżej standardu SQL/PSM jest DB2 i być może HSQLDB
To prawda. Ale wtedy nie DBMS w pełni implementuje standard SQL - ale implementacja Postgresa jest prawdopodobnie najbliższa standardowi.