Para aclarar la terminología:
SQL es una consulta lenguaje que se utiliza para seleccionar, actualizar, eliminar o crear datos en una base de datos relacional. No tiene elementos de procedimiento
como bucles (FOR
, WHILE
) o sentencias condicionales (IF
, ELSE
) o variables o cursores.
CREATE FUNCTION
es de hecho una "declaración SQL", pero es simplemente un "envoltorio" para especificar un bloque de código que es ejecutado por algo diferente al "motor" de consultas SQL. Postgres (a diferencia de otros DBMS) admite múltiples "motores de tiempo de ejecución" que pueden ejecutar el bloque de código que se pasó a la declaración "CREATE FUNCTION"; un artefacto de eso es que el código es en realidad una cadena, por lo que CREATE FUNCTION
solo ve una cadena, nada más.
Debido a que SQL no tiene elementos de procedimiento, no puede mezclar código de procedimiento y código SQL. Si desea ejecutar un código de procedimiento, debe decirle al servidor que está cambiando "motores" de alguna manera. Esto se hace a través del (SQL) DO
comando que nuevamente toma una cadena con la que no sabe qué hacer, la envía al servidor y dice "aquí hay un fragmento de código donde el usuario afirmó que el motor 'xyz' puede ejecutar" - xyz
es PL/pgSQL, Python, Perl o algo completamente diferente.
Esto es lo mismo que un bloque PL/SQL anónimo en Oracle que comienza con DECLARE
- todo lo que sigue es ejecutado por un motor de tiempo de ejecución diferente en el servidor. MySQL no tiene tal característica. La única forma de ejecutar código de procedimiento es crear un procedimiento (o función) y luego ejecutarlo. Es por eso que no existe tal cosa como DO
en MySQL.
El único producto DBMS que no distingue claramente entre el código de procedimiento y el "SQL simple" es SQL Server:T-SQL es una extensión del lenguaje SQL que le permite mezclar "SQL normal" y SQL de procedimiento sin decirle al servidor que el código necesita un motor diferente para ejecutarse (lo cual es una fuente de gran confusión para las personas que migran de SQL Server a Postgres u Oracle).
SQL/PSM es un estándar que define elementos de procedimiento que se pueden incrustar en un motor de base de datos que utiliza SQL como lenguaje de consulta. No conozco ningún producto DBMS que realmente implemente SQL/PSM. PL/pgSQL de Postgres, PL/SQL de Oracle, el dialecto procedimental de MySQL son algo similares a eso, pero están lejos de cumplir con el estándar SQL/PSM. Creo que lo más cercano al estándar SQL/PSM es DB2 y quizás HSQLDB
Eso es verdad. Pero entonces, no DBMS implementa completamente el estándar SQL, pero la implementación de Postgres es probablemente la más cercana al estándar.