CREATE FUNCTION
CREATE FUNCTION define una nueva función.
importante
En Amazon Aurora DSQL, CREATE FUNCTION solo admite funciones en lenguaje SQL (LANGUAGE sql).
Sintaxis admitida
CREATE [ OR REPLACE ] FUNCTION name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) [ RETURNS rettype | RETURNS TABLE ( column_name column_type [, ...] ) ] { LANGUAGE sql | { IMMUTABLE | STABLE | VOLATILE } | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER } | PARALLEL { UNSAFE | RESTRICTED | SAFE } | COST execution_cost | ROWS result_rows | SET configuration_parameter { TO value | = value | FROM CURRENT } | AS 'definition' | RETURN expression | BEGIN ATOMIC statement; [ statement; ... ] END } ... where LANGUAGE must be sql
Descripción
CREATE FUNCTION define una nueva función. CREATE OR REPLACE
FUNCTION creará una nueva función o reemplazará una definición existente. Para poder definir una función, debe tener el privilegio USAGE en el lenguaje.
Si se incluye un nombre de esquema, la función se crea en el esquema especificado. De lo contrario, la función se crea en el esquema actual. El nombre de la nueva función no debe coincidir con ninguna función existente con los mismos tipos de argumentos de entrada en el mismo esquema. Sin embargo, las funciones de distintos tipos de argumentos pueden compartir un nombre (esto se denomina sobrecarga).
Para reemplazar la definición actual de una función existente, utilice CREATE OR REPLACE
FUNCTION. No puede cambiar el nombre o los tipos de argumentos de una función de esta manera (de hecho, crearía una función nueva y distinta). Además, no puede utilizar CREATE
OR REPLACE FUNCTION para cambiar el tipo de retorno de una función existente. Para ello, debe descartar y volver a crear la función.
Cuando CREATE OR REPLACE FUNCTION se usa para reemplazar una función existente, la propiedad y los permisos de la función no cambian. A todas las demás propiedades de la función se les asignan los valores especificados o implícitos en el comando. Debe tener la función para reemplazarla (esto incluye ser miembro del rol de propietario).
Si borra una función y, a continuación, la vuelve a crear, la nueva función no será la misma entidad que la anterior; tendrá que eliminar las reglas, vistas, etc. existentes que hagan referencia a la función anterior. Use CREATE OR REPLACE FUNCTION para cambiar la definición de una función sin romper los objetos que hacen referencia a la función.
Se convierte en propietario de una función que ha creado.
Para poder crear una función, debe tener privilegios USAGE sobre los tipos de argumento y el tipo de retorno.
Una función SQL agrupa una o más instrucciones SQL en una unidad reutilizable e invocable. Utilice funciones para centralizar expresiones o cálculos comunes, aplicar una lógica coherente en varias consultas y simplificar el código de la aplicación llamando a una sola función en lugar de repetir la misma SQL.
Parameters
name-
El nombre (opcionalmente calificado por el esquema) de la función que se va a crear.
argmode-
El modo de un argumento:
IN,OUT,INOUToVARIADIC. Si se omite, el valor predeterminado esIN.VARIADICdebe ser el último parámetro de entrada; solo los argumentosOUTpueden seguirlo. Los argumentosOUTyINOUTno se pueden combinar con la notaciónRETURNS TABLE. argname-
El nombre de un argumento. En una función SQL, puede hacer referencia a un argumento por su nombre en el cuerpo de la función. El nombre de un argumento
OUToINOUTtambién es importante porque define el nombre de la columna correspondiente en el tipo de fila de resultados. argtype-
El tipo de datos de un argumento. Puede ser cualquier tipo base, tipo de matriz o dominio compatible con Aurora DSQL. Para obtener más información, consulte Tipos de datos admitidos en Aurora DSQL. También puede hacer referencia al tipo de columna de una tabla existente mediante la notación
%TYPE. default_expr-
Una expresión que se utilizará como valor predeterminado si no se especifica el argumento. La expresión debe ser coercible para el tipo de argumento del parámetro. Solo los argumentos
INyINOUTpueden tener un valor predeterminado. Cada argumento después de uno con un valor predeterminado también debe tener un valor predeterminado. rettype-
Un tipo de datos de retorno. Puede ser cualquier tipo base, tipo de matriz o dominio compatible con Aurora DSQL. Para obtener más información, consulte Tipos de datos admitidos en Aurora DSQL. Para devolver un conjunto de filas, utilice
SETOForettypeRETURNS TABLE. Si se supone que la función no debe devolver un valor, especifiquevoidcomo tipo de retorno. Cuando hay parámetrosOUToINOUT, la cláusulaRETURNSse puede omitir y la función devuelve unrecordo el tipo de fila correspondiente. RETURNS TABLE (column_namecolumn_type[, ...] )-
Especifica que la función devuelve un conjunto de filas con las columnas nombradas y sus tipos. Esto equivale a declarar uno o más parámetros de
OUTy especificarSETOFcomo el tipo de retorno. LANGUAGE sql-
El lenguaje utilizado para implementar la función. En Aurora DSQL, esto debe ser
sql. Si omite la cláusulaLANGUAGEy proporciona un cuerpoBEGIN ATOMICoRETURN,sqlse asume. Un cuerpo de cadena coherente (AS ') requiere una cláusuladefinition'LANGUAGE sqlexplícita; si se omite, se produce el errorno language specified. IMMUTABLE/STABLE/VOLATILE-
Estos atributos informan al optimizador de consultas acerca del comportamiento de la función. Puede especificar como máximo uno. Si omite los tres, la función tendrá el valor predeterminado
VOLATILE.-
IMMUTABLEindica que la función no puede modificar la base de datos y siempre devuelve el mismo resultado cuando se le dan los mismos valores de argumento. -
STABLEindica que la función no puede modificar la base de datos. En un solo análisis de la tabla, devuelve de forma coherente el mismo resultado para los mismos valores de argumento, pero el resultado puede cambiar según las instrucciones SQL. -
VOLATILEindica que el valor de la función puede cambiar incluso en un solo análisis de la tabla, por lo que no se pueden realizar optimizaciones.
-
CALLED ON NULL INPUT/RETURNS NULL ON NULL INPUT/STRICT-
CALLED ON NULL INPUT(valor predeterminado) indica que la función se llama normalmente cuando algunos de sus argumentos son nulos.RETURNS NULL ON NULL INPUToSTRICTindica que la función siempre devuelve un valor nulo cuando alguno de sus argumentos es nulo. Si se especifica, Aurora DSQL no ejecuta la función cuando algún argumento es nulo; en su lugar, la función devuelve automáticamente un valor nulo. [ EXTERNAL ] SECURITY INVOKER/[ EXTERNAL ] SECURITY DEFINER-
SECURITY INVOKER(valor predeterminado) indica que la función debe ejecutarse con los privilegios del usuario que la invoca.SECURITY DEFINERespecifica que la función se debe ejecutar con los privilegios del usuario propietario. La palabra claveEXTERNALestá permitida para garantizar la conformidad con SQL, pero es opcional. PARALLEL { UNSAFE | RESTRICTED | SAFE }-
Aurora DSQL acepta y almacena la marca
PARALLEL. Sin embargo, esta marca no afecta a la ejecución de la consulta. COSTexecution_cost-
Un número positivo que indique el costo estimado de ejecución para la función. Si la función devuelve un conjunto, este valor es el costo estimado por fila devuelta. El planificador de consultas utiliza esta estimación cuando no inserta la función.
ROWSresult_rows-
Un número positivo que indica el número estimado de filas que el planificador de consultas debería esperar que devuelva la función. Esto solo está permitido cuando se declara que la función devuelve un conjunto. El supuesto predeterminado es 1000 filas.
SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT }-
La cláusula
SEThace que el parámetro de configuración especificado se establezca en el valor especificado cuando se introduce la función y, a continuación, se restablece a su valor anterior cuando se cierra la función.SET FROM CURRENTguarda el valor del parámetro que es actual cuandoCREATE FUNCTIONse ejecuta como el valor que se aplicará al ingresar la función. AS 'definition'-
Una constante de cadena que define la función; el significado depende del idioma. En el caso de una función en lenguaje SQL, son las instrucciones SQL las que componen el cuerpo de la función.
RETURNexpression-
Define el cuerpo de la función mediante la sintaxis estándar de SQL para una función que devuelve una sola expresión. Esta es una alternativa al formulario de cadena coherente.
BEGIN ATOMICstatement; [ ... ] END-
Define el cuerpo de la función mediante la sintaxis estándar de SQL. El cuerpo consta de una o más instrucciones SQL. Este formulario solo es válido para
LANGUAGE sql. Las instrucciones de un cuerpo atómico se rastrean como dependencias de la función. Por ejemplo, una tabla a la que se hace referencia en el cuerpo no se puede eliminar sin eliminar también la función, o medianteDROP ... CASCADE.
Notas
Use la instrucción DROP FUNCTION para eliminar una función. También puede conceder y revocar privilegios en una función con GRANT y REVOKE (por ejemplo, REVOKE ALL ON FUNCTION).
Cualquier función que lea o modifique los datos de las tablas está sujeta al mismo comportamiento de transacción y simultaneidad que las instrucciones SQL equivalentes que se ejecutan directamente. Las funciones declaradas IMMUTABLE o STABLE no deben modificar la base de datos.
Para actualizar la definición de una función existente, utilice CREATE OR REPLACE
FUNCTION. No puede cambiar los tipos de argumentos ni el tipo de retorno de una función de esta manera; en su lugar, elimine y vuelva a crear la función.
Para cambiar el nombre de una función, cambiar su propietario o moverla a otro esquema, utilice ALTER
FUNCTION. Para cambiar cualquier otro atributo, use CREATE OR REPLACE FUNCTION con los cambios deseados. Para obtener más información, consulte ALTER FUNCTION.
Se admite la sobrecarga de funciones: puede definir varias funciones con el mismo nombre siempre que los tipos de argumentos de entrada sean diferentes. Una función definida por el usuario también puede llamar a otras funciones y puede ocultar una función integrada con el mismo nombre y tipo de argumento.
En el caso de una función que devuelve un conjunto (SETOF o RETURNS TABLE) cuyo cuerpo contiene más de una instrucción, solo se devuelve el resultado de la instrucción final. La función sigue ejecutando las instrucciones anteriores, pero descarta sus resultados. Este es el comportamiento estándar de las funciones del lenguaje SQL. Estructure la función de modo que la instrucción final produzca el conjunto de resultados completo.
Una función de devolución de conjuntos no garantiza ningún orden de filas en particular. Para controlar el orden de las filas, incluya una cláusula ORDER BY en la consulta.
Consideraciones
Las capacidades CREATE FUNCTION siguientes devuelven el error mostrado.
LEAKPROOF-
Devuelve el error
only superuser can define a leakproof function.NOT LEAKPROOF(predeterminado) se acepta. TRANSFORM FOR TYPE-
Devuelve el error
transform for type.typelanguage "sql" does not exist SUPPORT(función de soporte del planificador)-
Devuelve el error
function.name(internal) does not exist - Tipos compuestos definidos por el usuario (
CREATE TYPE ... AS), incluidas las funciones que devuelven un tipo compuesto -
Devuelve el error
unsupported statement: CompositeType.
Aurora DSQL no es compatible con CREATE PROCEDURE, lo que produce el error PROCEDURE is not supported.
El atributo WINDOW se acepta sintácticamente, pero no es útil para las funciones del lenguaje SQL. Evite usar este atributo.
Ejemplos
Cree una función SQL sencilla que sume dos números enteros, con un cuerpo coherente de cadena:
CREATE FUNCTION add(integer, integer) RETURNS integer AS 'SELECT $1 + $2;' LANGUAGE sql IMMUTABLE RETURNS NULL ON NULL INPUT;
Cree la misma función con el cuerpo RETURN estándar de SQL y los argumentos con nombre:
CREATE FUNCTION add(a integer, b integer) RETURNS integer LANGUAGE sql IMMUTABLE RETURN a + b;
Cree una función que devuelva un conjunto de filas mediante RETURNS TABLE y un cuerpo BEGIN ATOMIC:
CREATE FUNCTION employees_in_dept(dept_id integer) RETURNS TABLE (id integer, name text) LANGUAGE sql STABLE BEGIN ATOMIC SELECT id, name FROM employees WHERE department_id = dept_id; END;
Cree una función que se ejecute con los privilegios de su propietario y establezca un parámetro de configuración durante la llamada:
CREATE FUNCTION current_department() RETURNS text LANGUAGE sql STABLE SECURITY DEFINER SET search_path = app AS 'SELECT current_setting(''app.department'');';
Compatibilidad
Un comando CREATE FUNCTION se define en el estándar SQL. La implementación de PostgreSQL se puede utilizar de forma compatible, pero tiene muchas extensiones. Por el contrario, el estándar SQL especifica una serie de funciones opcionales que no están implementadas en PostgreSQL.
A continuación, se muestran problemas de compatibilidad importantes:
-
OR REPLACEes una extensión de PostgreSQL. -
Para garantizar la compatibilidad con otros sistemas de bases de datos,
argmodese puede escribir antes o después deargname. Pero solo la primera forma es compatible con el estándar. -
Para los parámetros predeterminados, el estándar SQL especifica solo la sintaxis con la palabra clave
DEFAULT. La sintaxis con=se usa en T-SQL y Firebird. -
El modificador
SETOFes una extensión de PostgreSQL. -
Solo SQL está estandarizado como lenguaje.
-
Todos los demás atributos excepto
CALLED ON NULL INPUTyRETURNS NULL ON NULL INPUTno están estandarizados. -
Para el cuerpo de las funciones
LANGUAGE sql, el estándar SQL solo especifica el formulariosql_body.
Las funciones LANGUAGE sql simples se pueden escribir de forma que se ajusten a los estándares y se puedan llevar a otras implementaciones. Las funciones más complejas que utilizan funciones avanzadas, atributos de optimización u otros lenguajes serán necesariamente específicas de PostgreSQL de manera significativa.