За да изясните терминологията:
SQL е заявка език, който се използва за избор, актуализиране, изтриване или създаване на данни в релационна база данни. Той няма процедурни елементи
подобни цикли (ЗА
, WHILE
) или условни изрази (IF
, ДРУГО
) или променливи или курсори.
СЪЗДАВАНЕ НА ФУНКЦИЯ
наистина е "SQL израз", но е просто "обвивка", за да посочи блок от код, който се изпълнява от нещо различно от "двигателя" на SQL заявката. Postgres (за разлика от други СУБД) поддържа множество „рънтайм машини“, които могат да изпълнят блока от код, предаден на оператора „CREATE FUNCTION“ – един артефакт от това е, че кодът всъщност е низ, така че CREATE FUNCTIONкод> вижда само низ, нищо друго.
Тъй като SQL няма процедурни елементи, не можете да смесвате процедурен код и SQL код. Ако искате да стартирате процедурен код, трябва да кажете на сървъра, че превключвате по някакъв начин „двигателите“. Това става чрез (SQL) DO
команда, която отново взема низ, с който не знае какво да прави, изпраща го на сървъра и казва „ето част от кода, за който потребителят твърди, че двигателят „xyz“ може да се изпълни“ - xyzкод> е или PL/pgSQL, Python, Perl или нещо съвсем различно.
Това е същото като анонимен PL/SQL блок в Oracle, който започвате с DECLARE
- всичко след това се изпълнява от различен двигател за изпълнение на сървъра. MySQL няма такава функция. Единственият начин да стартирате процедурен код е да създадете процедура (или функция), след което да я изпълните. Ето защо няма такова нещо като DO
в MySQL.
Единственият СУБД продукт, който не прави ясна разлика между процедурен код и "обикновен SQL" е SQL Server:T-SQL е разширение на SQL езика, което ви позволява да смесвате "обикновен SQL" и процедурен SQL, без да казвате на бекенда, че кодът се нуждае от различен двигател, за да работи (което е източник на голямо объркване за хората, мигриращи от SQL Server към Postgres или Oracle).
SQL/PSM е стандарт, който дефинира процедурни елементи, които могат да бъдат вградени в машина на база данни, която използва SQL като свой език за заявки. Не знам за продукт на СУБД, който реално да прилага SQL/PSM. PL/pgSQL на Postgres, PL/SQL на Oracle, процедурният диалект на MySQL са донякъде подобни на това, но далеч не са съвместими със стандарта SQL/PSM. Мисля, че най-близо до стандарта SQL/PSM е DB2 и може би HSQLDB
Това е вярно. Но след това,не СУБД напълно прилага SQL стандарта - но реализацията на Postgres вероятно е една от най-близките до стандарта.