DROP PROCEDURE — elimina un procedimiento
DROP PROCEDURE [ IF EXISTS ]nombre[ ( [ [modo_arg] [nombre_arg]tipo_arg[, ...] ] ) ] [, ...] [ CASCADE | RESTRICT ]
DROP PROCEDURE elimina la definición de uno o más
procedimientos existentes. Para ejecutar este comando, el usuario debe ser el
propietario de los procedimientos. Por lo general, se deben especificar los tipos
de argumentos de los procedimientos, ya que pueden existir varios procedimientos
diferentes con el mismo nombre y diferentes listas de argumentos.
IF EXISTSNo arroja un error si el procedimiento no existe. Se emite una advertencia (notice) en este caso.
nombreEl nombre (opcionalmente calificado por esquema) de un procedimiento existente.
modo_arg
El modo de un argumento: IN, OUT,
INOUT o VARIADIC. Si se omite,
el valor predeterminado es IN (pero consulta más abajo).
nombre_arg
El nombre de un argumento.
Ten en cuenta que DROP PROCEDURE en realidad no presta
atención a los nombres de los argumentos, ya que solo se utilizan los tipos
de datos de los argumentos para determinar la identidad del procedimiento.
tipo_argEl tipo o tipos de datos de los argumentos del procedimiento (opcionalmente calificados por esquema), si los hubiera. Consulta más abajo para ver los detalles.
CASCADEElimina automáticamente los objetos que dependen del procedimiento, y a su vez todos los objetos que dependen de esos objetos (consulta la Section 5.15).
RESTRICTRechaza eliminar el procedimiento si hay objetos que dependen de él. Este es el comportamiento predeterminado.
Si solo existe un procedimiento con el nombre dado, se puede omitir la lista de argumentos. En este caso, también se omiten los paréntesis.
En PostgreSQL, basta con listar los argumentos
de entrada (incluyendo INOUT),
ya que no se permite que dos rutinas con el mismo nombre compartan la misma
lista de argumentos de entrada. Además, el comando DROP
no comprobará realmente que hayas escrito correctamente los tipos
de los argumentos OUT; por lo tanto, cualquier argumento que esté
marcado explícitamente como OUT es solo ruido. Sin embargo,
es recomendable escribirlos para mantener la coherencia con el comando
CREATE correspondiente.
Para compatibilidad con el estándar SQL, también se permite escribir todos los
tipos de datos de los argumentos (incluyendo los de los argumentos OUT)
sin ningún marcador modo_arg.
Cuando se hace esto, los tipos de los argumentos OUT del
procedimiento sí se verificarán contra el comando.
Esta disposición crea una ambigüedad, ya que cuando la lista de argumentos no contiene
marcadores modo_arg, no está claro
qué regla se pretende aplicar.
El comando DROP intentará la búsqueda de ambas maneras y
arrojará un error si encuentra dos procedimientos diferentes.
Para evitar el riesgo de tal ambigüedad, se recomienda escribir explícitamente
los marcadores IN en lugar de dejar que se asuma el valor predeterminado,
forzando así el uso de la interpretación tradicional de PostgreSQL.
Las reglas de búsqueda explicadas anteriormente también las utilizan otros comandos que
actúan sobre procedimientos existentes, como ALTER PROCEDURE
y COMMENT ON PROCEDURE.
Si solo existe un procedimiento do_db_maintenance,
basta con este comando para eliminarlo:
DROP PROCEDURE do_db_maintenance;
Dada esta definición de procedimiento:
CREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...
cualquiera de estos comandos funcionaría para eliminarlo:
DROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text); DROP PROCEDURE do_db_maintenance(IN text, OUT text); DROP PROCEDURE do_db_maintenance(IN text); DROP PROCEDURE do_db_maintenance(text); DROP PROCEDURE do_db_maintenance(text, text); -- potencialmente ambiguo
Sin embargo, el último ejemplo sería ambiguo si también existiera, por ejemplo:
CREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...
Este comando cumple con el estándar SQL, con las siguientes extensiones de PostgreSQL:
El estándar solo permite eliminar un procedimiento por comando.
La opción IF EXISTS es una extensión.
La capacidad de especificar los modos y nombres de los argumentos es una extensión, y las reglas de búsqueda difieren cuando se especifican los modos.