CREATE PROCEDURE — define un nuevo procedimiento
CREATE [ OR REPLACE ] PROCEDURE
nombre ( [ [ modo_arg ] [ nombre_arg ] tipo_arg [ { DEFAULT | = } expr_por_omisión ] [, ...] ] )
{ LANGUAGE nombre_lenguaje
| TRANSFORM { FOR TYPE nombre_tipo } [, ... ]
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| SET parámetro_configuración { TO valor | = valor | FROM CURRENT }
| AS 'definición'
| AS 'archivo_objeto', 'símbolo_enlace'
| cuerpo_sql
} ...
CREATE PROCEDURE define un nuevo procedimiento.
CREATE OR REPLACE PROCEDURE creará un nuevo procedimiento
o reemplazará una definición existente.
Para poder definir un procedimiento, el usuario debe tener el privilegio
USAGE en el lenguaje.
Si se incluye un nombre de esquema, el procedimiento se crea en el esquema especificado. De lo contrario, se crea en el esquema actual. El nombre del nuevo procedimiento no debe coincidir con ningún procedimiento o función existente con los mismos tipos de argumentos de entrada en el mismo esquema. Sin embargo, los procedimientos y funciones con diferentes tipos de argumentos pueden compartir el nombre (esto se conoce como sobrecarga).
Para reemplazar la definición actual de un procedimiento existente, utiliza
CREATE OR REPLACE PROCEDURE. No es posible cambiar el
nombre o los tipos de argumentos de un procedimiento de esta manera (si lo intentas,
en realidad estarías creando un procedimiento nuevo y distinto).
Cuando se usa CREATE OR REPLACE PROCEDURE para reemplazar un
procedimiento existente, el propietario y los permisos del procedimiento no cambian.
A todas las demás propiedades del procedimiento se les asignan los valores especificados
o implícitos en el comando. Debes ser el propietario del procedimiento para poder reemplazarlo
(esto incluye ser miembro del rol propietario).
El usuario que crea el procedimiento se convierte en el propietario del mismo.
Para poder crear un procedimiento, debes tener el privilegio USAGE
en los tipos de argumentos.
Consulta la Section 36.4 para obtener más información sobre cómo escribir procedimientos.
nombreEl nombre (opcionalmente calificado por esquema) del procedimiento a crear.
modo_arg
El modo de un argumento: IN, OUT,
INOUT o VARIADIC. Si se omite, el
valor por omisión es IN.
nombre_argEl nombre de un argumento.
tipo_argEl tipo o tipos de datos de los argumentos del procedimiento (opcionalmente calificados por esquema), si los hay. Los tipos de argumentos pueden ser tipos base, compuestos o de dominio, o pueden hacer referencia al tipo de una columna de tabla.
Dependiendo del lenguaje de implementación, también podría permitirse
especificar “pseudotipos” como cstring.
Los pseudotipos indican que el tipo de argumento real no está completamente
especificado o está fuera del conjunto de tipos de datos SQL ordinarios.
Se hace referencia al tipo de una columna escribiendo
.
El uso de esta característica a veces puede ayudar a que un procedimiento sea independiente
de los cambios en la definición de una tabla.
nombre_tabla.nombre_columna%TYPE
expr_por_omisiónUna expresión que se utilizará como valor por omisión si no se especifica el parámetro. La expresión debe ser convertible al tipo de argumento del parámetro. Todos los parámetros de entrada que siguen a un parámetro con un valor por omisión también deben tener valores por omisión.
nombre_lenguaje
El nombre del lenguaje en el que está implementado el procedimiento.
Puede ser sql, c,
internal o el nombre de un lenguaje procedimental
definido por el usuario, por ejemplo, plpgsql. El valor por omisión es
sql si se especifica cuerpo_sql.
Encerrar el nombre entre comillas simples está obsoleto y requiere coincidencia de mayúsculas y minúsculas.
TRANSFORM { FOR TYPE nombre_tipo } [, ... ] }Enumera qué transformaciones debe aplicar una llamada al procedimiento. Las transformaciones convierten entre tipos SQL y tipos de datos específicos del lenguaje; consulta CREATE TRANSFORM. Las implementaciones de lenguajes procedimentales usualmente tienen conocimiento integrado de los tipos estándar, por lo que esos no necesitan ser enumerados aquí. Si la implementación de un lenguaje procedimental no sabe cómo manejar un tipo y no se proporciona ninguna transformación, volverá a un comportamiento predeterminado para convertir tipos de datos, pero esto depende de la implementación.
[EXTERNAL] SECURITY INVOKER[EXTERNAL] SECURITY DEFINERSECURITY INVOKER indica que el procedimiento debe
ejecutarse con los privilegios del usuario que lo llama. Ese es el valor
por omisión. SECURITY DEFINER especifica que el procedimiento
debe ejecutarse con los privilegios del usuario que lo posee.
La palabra clave EXTERNAL se permite para la conformidad con SQL,
pero es opcional ya que, a diferencia de SQL, esta característica se aplica a todos los
procedimientos y no solo a los externos.
Un procedimiento SECURITY DEFINER no puede ejecutar sentencias de control
de transacciones (por ejemplo, COMMIT y ROLLBACK,
dependiendo del lenguaje).
parámetro_configuraciónvalor
La cláusula SET hace que el parámetro de configuración especificado se
establezca en el valor indicado al entrar al procedimiento, y luego se restaure a su valor
anterior al salir del mismo. SET FROM CURRENT guarda el valor del parámetro
que esté activo cuando se ejecuta CREATE PROCEDURE como el valor a aplicar
al entrar al procedimiento.
Si se asocia una cláusula SET a un procedimiento, entonces los efectos de
un comando SET LOCAL ejecutado dentro del procedimiento para la misma
variable se limitan al procedimiento: el valor anterior del parámetro de configuración se
restaurará al salir del procedimiento. Sin embargo, un comando SET ordinario
(sin LOCAL) anula la cláusula SET, de la misma manera que
lo haría para un comando SET LOCAL anterior: los efectos de dicho comando
persistirán después de la salida del procedimiento, a menos que se revierta la transacción actual.
Si se asocia una cláusula SET a un procedimiento, entonces ese procedimiento
no puede ejecutar sentencias de control de transacciones (por ejemplo, COMMIT
y ROLLBACK, dependiendo del lenguaje).
Consulta SET y Chapter 19 para obtener más información sobre los nombres de parámetros y valores permitidos.
definiciónUna constante de cadena que define el procedimiento; el significado depende del lenguaje. Puede ser el nombre de un procedimiento interno, la ruta a un archivo de objeto, un comando SQL o texto en un lenguaje procedimental.
A menudo es útil utilizar el comillado de dólar (dollar quoting) (consulta Section 4.1.2.4) para escribir la cadena de definición del procedimiento, en lugar de la sintaxis normal de comillas simples. Sin el comillado de dólar, cualquier comilla simple o barra invertida en la definición del procedimiento debe escaparse duplicándola.
archivo_objeto, símbolo_enlace
Esta forma de la cláusula AS se utiliza para procedimientos en lenguaje C
cargables dinámicamente cuando el nombre del procedimiento en el código fuente de lenguaje C
no es el mismo que el nombre del procedimiento SQL. La cadena archivo_objeto
es el nombre del archivo de biblioteca compartida que contiene el procedimiento C compilado,
y se interpreta de la misma manera que para el comando LOAD.
La cadena símbolo_enlace es el símbolo de enlace del
procedimiento, es decir, el nombre del procedimiento en el código fuente de lenguaje C.
Si se omite el símbolo de enlace, se asume que es el mismo que el nombre del procedimiento SQL
que se está definiendo.
Cuando llamadas repetidas a CREATE PROCEDURE hacen referencia al mismo archivo
de objeto, el archivo solo se carga una vez por sesión. Para descargar y volver a cargar el archivo
(tal vez durante el desarrollo), inicia una nueva sesión.
cuerpo_sql
El cuerpo de un procedimiento LANGUAGE SQL. Este debe ser un bloque:
BEGIN ATOMICsentencia;sentencia; ...sentencia; END
Esto es similar a escribir el texto del cuerpo del procedimiento como una constante de cadena
(consulta definición más arriba), pero existen algunas diferencias:
Esta forma solo funciona para LANGUAGE SQL, mientras que la forma de constante
de cadena funciona para todos los lenguajes. Esta forma se analiza en el momento de la definición
del procedimiento, la forma de constante de cadena se analiza en el momento de la ejecución; por lo
tanto, esta forma no admite tipos de argumentos polimórficos y otras construcciones que no se puedan
resolver en el momento de la definición del procedimiento. Esta forma rastrea las dependencias entre
el procedimiento y los objetos utilizados en el cuerpo del procedimiento, por lo que DROP
... CASCADE funcionará correctamente, mientras que la forma que utiliza literales de cadena
puede dejar procedimientos huérfanos. Finalmente, esta forma es más compatible con el estándar SQL y
otras implementaciones de SQL.
Consulta la CREATE FUNCTION para obtener más detalles sobre la creación de funciones que también se aplican a los procedimientos.
Utiliza CALL para ejecutar un procedimiento.
CREATE PROCEDURE insert_data(a integer, b integer) LANGUAGE SQL AS $$ INSERT INTO tbl VALUES (a); INSERT INTO tbl VALUES (b); $$;
o
CREATE PROCEDURE insert_data(a integer, b integer) LANGUAGE SQL BEGIN ATOMIC INSERT INTO tbl VALUES (a); INSERT INTO tbl VALUES (b); END;
y se llama de la siguiente manera:
CALL insert_data(1, 2);
El comando CREATE PROCEDURE está definido en el estándar SQL.
La implementación de PostgreSQL se puede utilizar de forma
compatible pero tiene muchas extensiones. Para obtener más detalles, consulta también
CREATE FUNCTION.