Eliminar un procedimiento o una función de una base de datos
Al desarrollar herramientas que interactúan con diversas plataformas de SGBD, las sutiles diferencias en la sintaxis y el soporte de características pueden suponer un reto. Un caso es cómo eliminar definiciones de procedimientos almacenados, ya que el soporte de SQL y las convenciones varían entre sistemas.
Este artículo explora la sintaxis y el comportamiento del DROP de procedimientos almacenados en los populares sistemas de gestión de bases de datos relacionales (SGBDR), ayudando a los desarrolladores a comprender qué sentencias son compatibles y cómo usarlas correctamente.
En el artículo únicamente se consideran los SGBDR.
PostgreSQL
Es posible crear 2 tipos de funciones en PostgreSQL: normales y de agregación. Los procedimientos pueden crearse desde la versión 11, lanzada a finales de 2018. Las funciones, incluidas las funciones de agregación, están disponibles en versiones anteriores.
Utilizando una instrucción DROP ROUTINE, es posible eliminar cualquier función o procedimiento. La sintaxis de la consulta es:
DROP ROUTINE function_or_procedure_name(argument_types)
donde:
- argument_types – tipos de argumentos separados por coma.
Por ejemplo:
DROP ROUTINE my_function(INTEGER, INTEGER)
Pueden existir funciones y procedimientos con el mismo nombre pero con diferentes argumentos. Crear una función con el mismo nombre se denomina sobrecarga de funciones. Para eliminar ambigüedades al eliminar procedimientos o funciones, es necesario especificar los argumentos. Si la función o el procedimiento no está sobrecargado, no es necesario especificar los tipos de argumentos al eliminarlo:
DROP ROUTINE function_or_procedure_name
Existen sentencias separadas para eliminar funciones de agregación, funciones normales y procedimientos respectivamente:
- DROP AGGREGATE
- DROP FUNCTION
- DROP PROCEDURE
La sintaxis de estas sentencias es la misma que la de DROP ROUTINE.
Las sentencias DROP ROUTINE y DROP PROCEDURE y los procedimientos surgieron en la versión 11. Las sentencias DROP AGGREGATE y DROP FUNCTION se utilizan para eliminar funciones en versiones anteriores.
ORACLE
La siguiente sentencia se utiliza para eliminar procedimientos en Oracle:
DROP PROCEDURE procedure_name
La sentencia similar a la anterior se usa para eliminar funciones:
DROP FUNCTION function_name
Por ejemplo:
DROP PROCEDURE my_procedure;
Las funciones y los procedimientos pueden ser independientes o crearse en una colección utilizando un paquete. Para eliminar funciones y procedimientos de un paquete es posible sólo eliminando o redefiniendo el paquete.
Las funciones y procedimientos independientes no pueden sobrecargarse, por lo que no es necesario especificar los tipos de argumentos al eliminarlos.
MySQL y MariaDB
La siguiente sentencia se utiliza para eliminar procedimientos en MySQL y MariaDB:
DROP PROCEDURE procedure_name
La sentencia similar a la anterior se usa para eliminar funciones:
DROP FUNCTION function_name
MySQL y MariaDB no admiten la sobrecarga de procedimientos ni funciones; por lo tanto, solo se especifica un nombre.
A partir de la versión 10.3.3 (23 de diciembre de 2017) es posible crear funciones de agregación en MariaDB. Las funciones de agregación se eliminan como las normales utilizando la sentencia DROP FUNCTION.
SQLite
SQLite no admite la creación de procedimientos y funciones, por lo que no existe una sentencia para eliminarlos.
MS SQL Server
Las siguientes sentencias se utilizan para eliminar procedimientos, funciones normales y funciones de agregación en MS SQL:
DROP PROCEDURE procedure_name
DROP FUNCTION normal_function_name
DROP AGGREGATE aggregate_function_name
MS SQL no admite la sobrecarga de procedimientos y funciones; por lo que, al eliminarlos, sólo se especifica el nombre.
A diferencia de los procedimientos y funciones normales, las funciones de agregación en MS SQL se refieren únicamente a una implementación externa.
Netezza
Las siguientes sentencias se utilizan para eliminar procedimientos, funciones normales y funciones de agregación en Netezza:
DROP PROCEDURE procedure_name(argument_types)
DROP FUNCTION normal_function_name(argument_types)
DROP AGGREGATE aggregate_function_name(argument_types)
donde:
- argument_types – tipos de argumentos separados por coma.
Netezza admite la sobrecarga de funciones y procedimientos; por lo tanto, los tipos de argumentos son necesarios. A diferencia de los procedimientos, las funciones en Netezza se refieren únicamente a una implementación externa.
Informix
Las siguientes sentencias se utilizan para eliminar procedimientos, funciones normales y funciones de agregación en Informix:
DROP PROCRDURE procedure_name(argument_types)
DROP FUNCTION normal_function_name(argument_types)
DROP AGGREGATE aggregate_function_name
donde:
- argument_types – tipos de argumentos separados por coma.
No es necesario especificar los tipos de argumentos para las funciones de agregación.
Es posible sobrecargar procedimientos; por lo tanto, es posible que varios procedimientos tengan el mismo nombre. Para distinguirlos es posible asignar un nombre único al crear un procedimiento. Esto es válido también para las funciones normales. Se puede utilizar un nombre único para eliminar procedimientos y funciones normales en las siguientes sentencias:
DROP SPECIFIC PROCEDURE unique_procedure_name
DROP SPECIFIC FUNCTION unique_normal_function_name
Si un procedimiento o una función normal no tienen sobrecarga, entonces no es necesario especificar los tipos de argumentos al eliminarlos.
DROP PROCEDURE procedure_name
DROP FUNCTION normal_function_name
La siguiente sentencia permite eliminar un procedimiento o una función normal:
DROP ROUTINE name(argument_types)
o en el caso de que no exista sobrecarga:
DROP ROUTINE name
Esta sentencia es útil cuando se desconoce qué es lo que se debe eliminar: un procedimiento o una función.
Además, se puede utilizar un nombre único para eliminar:
DROP SPECIFIC ROUTINE unique_name
IBM Db2
Las siguientes sentencias se utilizan para eliminar procedimientos y funciones en IBM Db2:
DROP PROCEDURE procedure_name(argument_types)
DROP PROCEDURES function_name(argument_types)
donde:
- argument_types – tipos de argumentos separados por coma.
Los procedimientos pueden sobrecargarse; por lo tanto, es posible que varios procedimientos tengan el mismo nombre. Para definirlos es posible asignar un valor único al crear un procedimiento. Esto es válido también para las funciones. Se puede usar un nombre único para eliminar procedimientos y funciones mediante las siguientes sentencias:
DROP SPECIFIC PROCEDURE unique_procedure_name
DROP SPECIFIC FUNCTION unique_function_name
Si un procedimiento o una función no tiene sobrecarga, entonces no es necesario especificar los tipos de argumentos al eliminarlo:
DROP PROCEDURE procedure_name
DROP FUNCTION function_name
AWS Athena
Athena no admite la creación de procedimientos y funciones; por lo tanto, no existe la posibilidad de eliminarlos.
Teradata
Las siguientes sentencias se utilizan para eliminar procedimientos y funciones en Teradata:
DROP PROCEDURE procedure_name
DROP FUNCTION function_name(argument_types)
donde:
- argument_types – tipos de argumentos separados por coma.
Teradata permite sobrecargar una función (pero no un procedimiento). En una sentencia CREATE FUNCTION, además del nombre de la función, es necesario especificar un nombre único de la función durante la sobrecarga. Utilizando un nombre único, es posible eliminar una función con la siguiente sentencia:
DROP SPECIFIC FUNCTION unique_function_name
Si una función no tiene sobrecargas, es posible no especificar los tipos de argumentos al eliminarla:
DROP FUNCTION function_name
Teradata admite macros, que son en cierto modo similares a los procedimientos. La siguiente sentencia se utiliza para eliminar macros:
DROP MACRO macro_name
Vertica
Vertica permite crear nuevos procedimientos (sentencia CREATE PROCEDURE), los cuales se refieren a un archivo ejecutable externo. No se admiten procedimientos almacenados.
La siguiente sentencia se utiliza para eliminar procedimientos:
DROP PROCEDURE procedure_name(argument_types)
donde:
- argument_types – tipos de argumentos separados por coma.
Los procedimientos pueden sobrecargarse. Los tipos de argumentos son necesarios incluso si el procedimiento no tiene sobrecargas.
Vertica admite muchos tipos de funciones:
- Funciones de agregación (CREATE AGGREGATE)
- Funciones analíticas (CREATE ANALITIC FUNCTION)
- Funciones de filtro de carga (CREATE FUNCTION)
- Funciones de análisis de carga (CREATE PARSER)
- Funciones de origen de carga (CREATE SOURCE)
- Funciones de transformación (CREATE TRANSFORM FUNCTION)
- Funciones escalares (CREATE FUNCTION)
- Funciones SQL (CREATE FUNCTION)
Existen sentencias entre paréntesis que ayudan a crear funciones.
Todas las funciones, excepto las funciones SQL, tienen una implementación externa, es decir, se refieren a una biblioteca dinámica externa.
Las funciones SQL se almacenan en una base de datos pero sólo pueden utilizar consultas simples.
Existe una sentencia para eliminar funciones para cada tipo de función, excepto las funciones analíticas.
DROP AGGREGATE FUNCTION name(argument_types)
DROP FILTER name()
DROP SOURCE name()
DROP PARSER name()
DROP TRANSFORM FUNCTION name(argument_types)
DROP FUNCTION name(argument_types)
donde:
- argument_types – tipos de argumentos separados por coma.
Cualquier función se puede eliminar mediante una sentencia DROP FUNCTION, excepto las funciones de agregación y de transformación. Las funciones pueden sobrecargarse, por lo que, para eliminarlas, es necesario especificar los tipos de argumentos. Estos son necesarios incluso si la función no tiene sobrecargas.
SAP HANA
Las siguientes sentencias se utilizan para eliminar procedimientos y funciones en SAP HANA:
DROP PROCEDURE procedure_name
DROP FUNCTION function_name
No se admite la sobrecarga de funciones y procedimientos; por lo que, al eliminarlos, se especifica sólo el nombre.
Apache Impala
Impala permite crear una función (escalar y de agregación) con una implementación externa. Las funciones escalares pueden implementarse en C++ y Java. Las funciones de agregación únicamente en C++. La siguiente sentencia se utiliza para eliminar funciones de agregación:
DROP AGGREGATE FUNCTION function_name(argument_types)
donde:
- argument_types – tipos de argumentos separados por coma.
La sentencia para eliminar una función escalar depende de la implementación del lenguaje.
La siguiente sentencia se utiliza para eliminar una función escalar en C++:
DROP FUNCTION scalar_function_name(arguments_types)
La siguiente sentencia se utiliza para eliminar una función escalar en Java:
DROP FUNCTION scalar_function_name
Impala permite la sobrecarga de funciones; por lo que, es necesario especificar los tipos de argumentos al eliminarlas. Las funciones en Java se sobrecargan por sí mismas según Java, por ello, no es necesario especificar los argumentos.
HPL/SQL proporciona mayores oportunidades para utilizar procedimientos y funciones.
Apache Hive
Hive permite crear funciones con una implementación externa en Java. Las funciones pueden ser temporales o permanentes. Las funciones temporales existen sólo en la sesión actual.
La siguiente sentencia se utiliza para eliminar funciones permanentes:
DROP FUNCTION function_name
La siguiente sentencia se utiliza para eliminar funciones temporales:
DROP TEMPORARY FUNCTION function_name
Hive permite crear macros temporales que pueden contener expresiones simples. La siguiente sentencia se utiliza para eliminar macros:
DROP TEMPORARY MACRO macro_name
HPL/SQL proporciona mayores oportunidades para utilizar procedimientos y funciones.
Diferente documentación de SGBD: