Instrucción CREATE FUNCTION (resumen)

La sentencia CREATE FUNCTION registra una función definida por el usuario con un servidor de bases de datos. Cada tipo de función que puede registrar con esta sentencia se describe por separado.

escalares externas
Inicio del cambioLa función se escribe en un lenguaje de programación y devuelve un valor escalar. La rutina ejecutable externa (paquete) se registra en un servidor de base de datos junto con varios atributos de la función. Cada vez que se invoca la función, el paquete se ejecuta una o más veces. Véase la declaración CREATE FUNCTION (función escalar externa ).fin del cambio
Tabla externa
Inicio del cambioLa función está escrita en un lenguaje de programación. Devuelve una tabla a la subselección desde la que se inició devolviendo una fila cada vez que se inicia la función. La rutina ejecutable externa (paquete) se registra en un servidor de base de datos junto con varios atributos de la función. Cada vez que se invoca la función, el paquete se ejecuta una o más veces. Véase la instrucción CREATE FUNCTION (función de tabla externa ).fin del cambio
Derivadas
Inicio del cambioLa función se implementa invocando otra función (ya sea integrada, externa, SQL o de origen) que existe en el servidor. La función hereda los atributos de la función de origen subyacente. Una función de origen no tiene un paquete asociado. Véase la declaración CREATE FUNCTION (función de origen ).fin del cambio
escalares de SQL
La función está escrita exclusivamente en sentencias SQL y devuelve un valor escalar. El cuerpo de una función escalar SQL se escribe en el lenguaje de procedimientos SQL (SQL PL). La función se define en el servidor actual junto con varios atributos de la función.
Inicio del cambioDb2 admite dos tipos de funciones escalares SQL, en línea y compiladas:
  • Las funciones escalares SQL en línea contienen una sola instrucción RETURN, que devuelve el valor de una expresión simple. La función no se invoca como parte de una consulta; en su lugar, la expresión de la sentencia RETURN de la función se copia (en línea) en la propia consulta. Por lo tanto, no se genera un paquete para una función escalar SQL en línea.
  • Las funciones escalares SQL compiladas admiten un conjunto más amplio de funcionalidades, incluidas todas las sentencias SQL PL. Se genera un paquete para una función escalar SQL compilada. Contiene el cuerpo de la función, incluidas las instrucciones de control. También puede contener declaraciones generadas por Db2. Cada vez que se invoca la función, el paquete se ejecuta una o más veces.
fin del cambio

Inicio del cambioCuando se procesa una instrucción CREATE FUNCTION para una función escalar SQL, Db2 intenta crear una función escalar SQL en línea. Si la función no se puede crear como una función en línea, Db2 intenta crear una función escalar SQL compilada. Para obtener más información sobre la sintaxis y las reglas para estos tipos de funciones, consulte la instrucción CREATE FUNCTION (función escalar SQL en línea) y la instrucción CREATE FUNCTION (función escalar SQL compilada). fin del cambio

Inicio del cambioPara determinar qué tipo de función escalar SQL se crea, consulte la columna INLINE de la tabla de catálogo SYSIBM.SYSROUTINES. fin del cambio

tabla de SQL
Inicio del cambioLa función se escribe exclusivamente como una instrucción SQL RETURN y devuelve un conjunto de filas. El cuerpo de una función de tabla SQL se escribe en el lenguaje de procedimiento SQL. La función se define en el servidor actual junto con varios atributos. La función no se invoca como parte de una consulta. En su lugar, la expresión de la sentencia RETURN de la función se copia (en línea) en la propia consulta. Por lo tanto, no se genera un paquete para una función de tabla SQL. Véase la instrucción CREATE FUNCTION (función de tabla SQL ).fin del cambio

Notas para todos los tipos de FUNCIÓN CREAR

Las siguientes consideraciones se aplican para crear todo tipo de funciones:

Privilegios de propietario:
Para todas las funciones, excepto las funciones de origen, el propietario está autorizado a ejecutar la función (privilegio EXECUTE) y tiene la capacidad de conceder estos privilegios a otros. Para obtener más información, consulte la declaración GRANT (privilegios de función o procedimiento ). Para obtener más información sobre la propiedad del objeto, consulte Autorización, privilegios, permisos, máscaras y propiedad del objeto.
Elección del esquema y del nombre de la función:

La combinación de nombre, nombre de esquema, número de parámetros y tipo de datos de cada parámetro (sin tener en cuenta los atributos de longitud, precisión, escala, subtipo o esquema de codificación del tipo de datos) no debe identificar una función definida por el usuario que exista en el servidor actual. Si la función tiene más de 30 parámetros, solo se utilizan los 30 primeros para determinar si la función es única.

Puede utilizar el mismo nombre para más de una función si la firma de cada función es única.

  • La forma no cualificada de nombre de función no debe ser ninguna de las siguientes palabras clave reservadas del sistema, incluso si las especifica como identificadores delimitados:
    ALL                     LIKE                     UNIQUE
    AND                     MATCH                    UNKNOWN
    ANY                     NOT                      =
    BETWEEN                 NULL                     ¬=
    DISTINCT                ONLY                     <
    EXCEPT                  OR                       <=
    EXISTS                  OVERLAPS                 ¬<
    FALSE                   SIMILAR                  >
    FOR                     SOME                     >=
    FROM                    TABLE                    ¬>
    IN                      TRUE                     <>
    IS                      TYPE                                          

Inicio del cambioEl nombre del esquema no puede empezar por "SYS" a menos que sea uno de los siguientes nombres: "SYSADM", "SYSFUN", "SYSIBMADM" o "SYSTOOLS". El uso de "SYSFUN", "SYSIBMADM" o "SYSTOOLS" para el nombre del esquema requiere la autorización de SYSADM o SYSCTRL.fin del cambio

Definición de los parámetros
Los parámetros de entrada para la función se especifican como una lista entre paréntesis.

Una función no puede tener parámetros de entrada. En este caso, se debe especificar un paréntesis vacío, por ejemplo:

CREATE FUNCTION WOOFER()

El tipo de datos del resultado de la función se especifica en la cláusula RETURNS de la función.

Elección de tipos de datos para parámetros:
Cuando elija los tipos de datos de los parámetros de entrada y salida para su función, tenga en cuenta las reglas de promoción que pueden afectar a los valores de los parámetros. (Ver Promoción de tipos de datos ). Por ejemplo, una constante que es uno de los argumentos de entrada de la función podría tener un tipo de datos incorporado que es diferente del tipo de datos que espera la función y, lo que es más importante, podría no ser promocionable a ese tipo de datos esperado. Según las reglas de la promoción, considere utilizar los siguientes tipos de datos para los parámetros:
  • INTEGER en lugar de SMALLINT
  • DOUBLE en lugar de REAL
  • VARCHAR en lugar de CHAR
  • VARGRAPHIC en lugar de GRAPHIC
  • VARBINARIO en lugar de BINARIO

Para la portabilidad de funciones entre plataformas que no son Db2 for z/OS®, no utilice los siguientes tipos de datos, que podrían tener representaciones diferentes en plataformas diferentes:

  • Float. Utilice DOBLE o REAL en su lugar.
  • Numérico. Utilice DECIMAL en su lugar.

Para obtener descripciones de los tipos de datos incorporados, consulte Tipos de datos y la descripción de built-in-type en la sentencia CREATE TABLE.

Especificar AS LOCATOR para un parámetro:
Pasar un localizador en lugar de un valor puede dar lugar a que se pasen menos bytes de entrada o salida de la función. Esto puede ser útil cuando el valor del parámetro es muy grande. La cláusula AS LOCATOR especifica que se pasa un localizador al valor del parámetro en lugar del valor real. Especifique AS LOCATOR solo para parámetros que tengan un tipo de datos LOB o un tipo distinto basado en un tipo de datos LOB y solo cuando LANGUAGE JAVA no esté en vigor.

La cláusula AS LOCATOR no tiene ningún efecto para determinar si los tipos de datos se pueden promocionar, ni afecta a la signatura de función, que se utiliza en la resolución de función.

AS LOCATOR no debe especificarse para una función de origen o SQL.

AS LOCATOR no debe especificarse si la función se define con NO SQL.

Consideraciones para una función que se define utilizando una cláusula TABLE LIKE name AS LOCATOR:
Si se define una función con un parámetro de tabla (el TABLE LIKE nombre AS LOCATOR se especificó una cláusula en la declaración CREATE FUNCTION para indicar que uno de los parámetros de entrada es una tabla de transición), ninguna declaración ALTER FUNCTION que especifique una lista de parámetros como parte de la alteración puede cambiar la función. Por ejemplo, se requiere una lista de parámetros como parte de la especificación de rutina al agregar o reemplazar una versión de una función. En estos casos, la función debe eliminarse y volver a crearse.
Determinación de la singularidad de las funciones en un esquema:
En el servidor actual, la firma de cada función, que es el nombre de la función calificada combinado con el número y los tipos de datos de los parámetros de entrada, debe ser única. Si la función tiene más de 30 parámetros de entrada, solo se utilizan los tipos de datos de los primeros 30 para determinar la singularidad. Esto significa que dos esquemas diferentes pueden contener cada uno una función con el mismo nombre que tenga los mismos tipos de datos para todos sus tipos de datos correspondientes. Sin embargo, un único esquema no debe contener varias funciones con el mismo nombre que tengan los mismos tipos de datos para todos sus tipos de datos correspondientes.

Db2 , al determinar si los tipos de datos correspondientes coinciden, no tiene en cuenta ningún atributo de longitud, precisión o escala en la comparación. Db2 considera que los sinónimos de tipos de datos coinciden. Por ejemplo, REAL y FLOAT, y DOUBLE y FLOAT se consideran una coincidencia. Por lo tanto, CHAR(8) y CHAR(35) se consideran iguales, al igual que DECIMAL(11,2), DECIMAL(4,3), DECFLOAT(16) y DECFLOAT(34), TIMESTAMP(6) y TIMESTAMP(9), TIMESTAMP(6) CON ZONA HORARIA y TIMESTAMP(9) CON ZONA HORARIA. Además, se considera que los tipos de carácter y gráfico, y los tipos de marca de tiempo son los mismos. Por ejemplo, se considera que los siguientes son del mismo tipo: CHAR y GRAPHIC, VARCHAR y VARGRAPHIC, CLOB y DBCLOB, TIMESTAMP WITHOUT TIME ZONE y TIMESTAMP WITH TIME ZONE. CHAR(13) y GRAPHIC(8) se consideran del mismo tipo. Se devuelve un error si la firma de la función que se está creando es un duplicado de una firma de una función definida por el usuario existente con el mismo nombre y esquema.

Suponga que las siguientes sentencias se ejecutan para crear cuatro funciones en el mismo esquema. Las sentencias segunda y cuarta fallan porque crean funciones que son duplicados de las funciones que crearon las sentencias primera y tercera.

  CREATE FUNCTION PART (INT, CHAR(15)) …
  CREATE FUNCTION PART (INTEGER, CHAR(40)) …
  CREATE FUNCTION ANGLE (DECIMAL(12,2)) …
  CREATE FUNCTION ANGLE (DEC(10,7)) …
Especificar un nombre concreto para una función:
Al definir varias funciones con el mismo nombre y esquema (con diferentes listas de parámetros), se recomienda especificar también un nombre específico.

El nombre específico se puede utilizar para identificar de forma única la función, por ejemplo, al buscar en esta función, al descartar la función o al comentar sobre la función. Sin embargo, la función no puede invocarse por su nombre específico.

El nombre específico está implícita o explícitamente calificado con un nombre de esquema. Si no se especifica un nombre de esquema en CREATE FUNCTION, es el mismo que el nombre de esquema explícito o implícito del nombre de la función (nombre-de-función). Si se especifica un nombre de esquema, debe ser el mismo que el nombre de esquema explícito o implícito del nombre de la función. El nombre, incluido el nombre del esquema, no debe identificar el nombre específico de otra función o procedimiento que exista en el servidor actual.

Si no se especifica la cláusula SPECIFIC, se genera un nombre específico.

Extender o anular una función integrada
No se recomienda dar a una función externa definida por el usuario el mismo nombre que una función integrada, a menos que sea necesario ampliar o anular la funcionalidad de la función integrada.

Si tiene la intención de crear una función con el mismo nombre que una función incorporada, tenga cuidado de mantener la singularidad de su firma de función. Si su función tiene el mismo nombre y tipos de datos que los parámetros correspondientes de la función incorporada, pero implementa una lógica diferente, Db2 podría elegir la función incorrecta cuando la función se invoque con un nombre de función no calificado. Por ejemplo, si el esquema de la nueva función aparece en la ruta de SQL antes que los esquemas del sistema, Db2 podría elegir una función definida por el usuario en lugar de la función integrada. Una aplicación que utiliza el nombre no cualificado y que anteriormente funcionaba correctamente utilizando la función integrada de ese nombre podría fallar. También podría parecer que se ejecuta correctamente pero proporcionar un resultado diferente si Db2 elige la función definida por el usuario en lugar de la función incorporada. Esta situación puede ocurrir con sentencias SQL dinámicas, o cuando se repiten sentencias SQL estáticas.

Ampliación de la funcionalidad de las funciones integradas existentes
Cree la nueva función definida por el usuario con el mismo nombre que la función incorporada y una firma de función única. Por ejemplo, podría ser necesaria una función definida por el usuario similar a la función integrada ROUND que acepte el tipo distinto MONEY como entrada en lugar de los tipos numéricos integrados. En este caso, la firma de la nueva función definida por el usuario denominada ROUND es diferente de todas las firmas de funciones admitidas por la función ROUND integrada.
Anulación de una función integrada:
Cree la nueva función definida por el usuario con el mismo nombre y firma que una función incorporada. La nueva función tiene el mismo nombre y tipo de datos que los parámetros correspondientes de la función incorporada, pero implementa una lógica diferente.

Por ejemplo, podría ser útil utilizar reglas de redondeo diferentes a las de la función ROUND integrada. En este caso, la firma para la nueva función definida por el usuario llamada ROUND será la misma que la firma que admite la función ROUND integrada.

Otro caso para anular una función incorporada es utilizar su funcionalidad cuando un argumento no es un tipo de datos incorporado. En lugar de pasar explícitamente el argumento a un tipo de datos integrado, puede definir una función fuente que acepte el argumento de tipo de datos definido por el usuario y lo pase a la función integrada subyacente. Una función de origen se define con una referencia a una función incorporada o a otra función definida por el usuario. Para obtener más información sobre las funciones con origen, consulte la instrucción CREATE FUNCTION (función con origen).

La palabra clave DISTINCT puede pasarse en la invocación de una función definida por el usuario que se origina en una de las funciones agregadas incorporadas. Por ejemplo, supongamos que MY_AVG es una función definida por el usuario que se obtiene de la función AVG incorporada. La función definida por el usuario podría invocarse con 'MY_AVG (expresión DISTINCT)'. Esto da como resultado que la función AVG incorporada subyacente se invoque con la palabra clave DISTINCT.

Registros especiales en funciones
La configuración de los registros especiales del invocador es heredada por la función en la invocación y restaurada al volver al invocador. Los registros especiales pueden modificarse en una función que pueda ejecutar sentencias SQL, pero estos cambios no afectan a la persona que llama.
Variables globales en funciones:
El contenido de las variables globales a las que se hace referencia en una función se hereda del entorno de invocación.
Cursores desplazables especificados con funciones definidas por el usuario:
Una fila se puede recuperar más de una vez con un cursor desplazable. Por lo tanto, si una instrucción SELECT de un cursor desplazable invoca una función que no es determinista en la lista de selección, se puede recuperar una fila varias veces con resultados diferentes para cada recuperación. Del mismo modo, si la instrucción SELECT de un cursor desplazable invoca una función definida por el usuario con acción externa, la acción se ejecuta con cada obtención.
Consideraciones para funciones seguras:
Para crear una función segura, el administrador de seguridad suele examinar los datos a los que accede una función, asegurarse de que es segura y conceder el privilegio CREATE_SECURE_OBJECT a alguien que actualmente requiera los privilegios para crear una función segura definida por el usuario. Después de crear la función, revocan el privilegio CREATE_SECURE_OBJECT del propietario de la función.

Una función de origen no se puede crear como función segura.

Si un permiso de fila o una definición de máscara de columna hace referencia a una función definida por el usuario, la función definida por el usuario debe ser segura porque los datos confidenciales podrían pasarse como argumentos a la función. La columna SECURE en la DSN_FUNCTION_TABLE indica si una función definida por el usuario se considera segura.

Si una función segura definida por el usuario invoca otras funciones definidas por el usuario, Db2 no valida si esas funciones anidadas definidas por el usuario tienen el atributo SECURED. Si esas funciones anidadas pueden acceder a datos confidenciales, el administrador de seguridad debe asegurarse de que esas funciones tengan permiso para acceder a los datos confidenciales y debe garantizar que se establezca un procedimiento de auditoría de control de cambios para todos los cambios en esas funciones.