Sentencia CREATE FUNCTION (interfaz agregada)

La sentencia CREATE FUNCTION (interfaz agregada) se utiliza para registrar una función de agregación definida por el usuario en el servidor actual.

Una función de agregación devuelve un valor único que es el resultado de una evaluación de un conjunto de valores similares, como los de la columna dentro de un conjunto de filas.

Invocación

Esta sentencia se puede incorporar en un programa de aplicación o bien emitirse utilizando sentencias de SQL dinámico. Es una sentencia ejecutable que puede prepararse de forma dinámica sólo si el comportamiento de ejecución de DYNAMICRULES está en vigor para el paquete (SQLSTATE 42509).

Autorización

Los privilegios que posee el ID de autorización de la sentencia deben incluir al menos una de las siguientes autorizaciones:
  • Autorización IMPLICIT_SCHEMA en la base de datos, si el nombre de esquema de la función no hace referencia a un esquema existente
  • Privilegio CREATEIN para el esquema, si el nombre de esquema de la función hace referencia a un esquema existente
  • Autorización DBADM
Los privilegios del ID de autorización de la sentencia también deben incluir el privilegio EXECUTE en las siguientes rutinas si el ID de autorización de la sentencia no tiene autorización DATAACCESS.
  • INITIATE
  • ACCUMULATE
  • MERGE
  • FINALIZE

Los privilegios de grupo, excepto para PUBLIC, no se tienen en cuenta en ningún objeto dependiente especificado en la sentencia CREATE FUNCTION.

Para sustituir una función existente, el ID de autorización de la sentencia debe ser el propietario de la función existente (SQLSTATE 42501).

Si se especifica la opción SECURED, el ID de autorización de la sentencia debe incluir la autorización SECADM o CREATE_SECURE_OBJECT (SQLSTATE 42501).

Sintaxis

Leer el esquema de sintaxisOmitir el esquema de sintaxis visual CREATE OR REPLACE FUNCTION nombre-función ( ,declaración-parámetro ) ? RETURNS tipo2-datostipo3-datosCAST FROMtipo4-datos lista-opciones ? AGGREGATE WITH (,declaración-variable-estado) USING IN MODULEnombre-módulo INITIALIZE designador-procedimiento ACCUMULATE designador-procedimiento MERGE designador-procedimiento FINALIZE designador-función ?
declaración-parámetro
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualINnombre-parámetro tipo1-datos cláusula-por-omisión
tipo-datos1, tipo-datos2, tipo-datos3, tipo-datos4, tipo-datos5
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual tipo-incorporado
tipo-incorporado
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( entero,0, entero)FLOAT(53)( entero)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( enteroOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( enteroOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( enteroKMGOCTETSCODEUNITS32)GRAPHIC(1)( enteroCODEUNITS16CODEUNITS32)VARGRAPHIC( enteroCODEUNITS16CODEUNITS32)DBCLOB(1M)( enteroKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( entero)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( entero)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( enteroKMG)BINARY(1)( entero)VARBINARYBINARY VARYING(entero)BLOBBINARY LARGE OBJECT(1M)( enteroKMG)DATETIMETIMESTAMP(6)(entero)XMLSYSPROC.DB2SECURITYLABEL23
cláusula-por-omisión
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual DEFAULT NULLconstanteregistro-especialvariable-global(expresión)
lista-opciones
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual ? SPECIFICnombre-específico ? NOT DETERMINISTICDETERMINISTIC ? CALLED ON NULL INPUT ? EXTERNAL ACTIONNO EXTERNAL ACTION ? NO SCRATCHPAD ? NO FINAL CALL ? ALLOW PARALLEL ? NOT SECUREDSECURED
declaración-variable-estado
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual nombre-variable-estado tipo5-datos
designador-procedimiento
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual PROCEDUREnombre-procedimiento(,tipo-datos)SPECIFIC PROCEDUREnombre-específico
designador-función
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual FUNCTIONnombre-función(,tipo-datos)SPECIFIC FUNCTIONnombre-específico
Notas:
  • 1 La cláusula FOR BIT DATA se puede especificar en cualquier orden con las restricciones de columna siguientes. La cláusula FOR BIT DATA no se puede especificar con unidades de serie CODEUNITS32 (SQLSTATE 42613).
  • 2 DB2SECURITYLABEL es el tipo diferenciado incorporado que debe utilizarse para definir la columna de etiqueta de seguridad de fila de una tabla protegida.
  • 3 Para una columna de tipo DB2SECURITYLABEL, NOT NULL WITH DEFAULT está implícito y no se puede especificar explícitamente (SQLSTATE 42842). El valor por omisión de una columna de tipo DB2SECURITYLABEL es la etiqueta de seguridad del ID de autorización de sesión correspondiente al acceso de grabación.

Descripción

OR REPLACE
Especifica que se debe sustituir la definición de la función si existe una en el servidor actual. La definición existente se descarta de forma efectiva antes de que la nueva definición se sustituya en el catálogo, con la excepción de que los privilegios que se han otorgado sobre la función no se ven afectados por ello. Esta opción sólo puede especificarla el propietario del objeto. Esta opción se ignora si no existe una definición para la función en el servidor actual. Una función existente se puede sustituir si se aplica cualquiera de las siguientes condiciones:
  • El nombre específico y el nombre de función de la nueva definición tienen que ser los mismos que el nombre específico y el nombre de función de la antigua definición
  • La firma de la nueva definición debe coincidir con la firma de la definición antigua
De lo contrario, se creará una nueva función.

Si se hace referencia a la función en la definición de un permiso de fila o una máscara de columna, la función no se puede sustituir (SQLSTATE 42893).

nombre-función
Nombres de función que se están definiendo. Consiste en el nombre, calificado o no calificado, que designa una función. El formato no calificado de un nombre-función es un identificador SQL. En las sentencias de SQL dinámico, el registro especial CURRENT SCHEMA se utiliza como calificador para un nombre de objeto no calificado. En las sentencias de SQL estático, la opción de precompilación/enlace QUALIFIER especifica implícitamente el calificador para los nombres de objeto no calificados. La forma calificada es un nombre-esquema seguido de un punto y un identificador de SQL. El nombre calificado no debe ser el mismo que el tipo de datos del primer parámetro, si ese parámetro es un tipo estructurado.

La firma de función no debe identificar una función o método descrito en el catálogo (SQLSTATE 42723). Cuando se está evaluando el nombre, se tiene en cuenta el número de parámetros y el tipo de datos de cada parámetro (sin tener en cuenta ningún atributo de longitud, precisión o escala del tipo de datos). El nombre no calificado, junto con el número y el tipo de datos de los parámetros, que por supuesto debe ser exclusivo en su esquema. Sin embargo, no es necesario que sea exclusivo en todos los esquemas.

Si se especifica un nombre de dos partes, el nombre-esquema no puede empezar por SYS (SQLSTATE 42939).

Algunos nombres que se utilizan como palabras clave en los predicados están reservados para que los utilice el sistema y no pueden utilizarse como nombre-función (SQLSTATE 42939). Los nombres son SOME, ANY, ALL, NOT, AND, OR, BETWEEN, NULL, LIKE, EXISTS, IN, UNIQUE, OVERLAPS, SIMILAR, MATCH y los operadores de comparación.

En general, puede utilizarse el mismo nombre para más de una función si existe alguna diferencia en la signatura de las funciones.

Aunque no hay ninguna prohibición al respecto, no debe proporcionar a la función de interfaz agregada el mismo nombre que a la función incorporada, a menos que sea una sustitución temporal intencionada. Ejemplos de estas funciones son MAX, MIN y AVG. La creación de una función definida por el usuario que tiene un comportamiento de diferente, pero con el mismo nombre, y argumentos coherentes como una función de agregación o escalar incorporada, puede generar problemas. Los ejemplos incluyen:
  • Problemas en sentencias de SQL dinámico
  • Las aplicaciones de SQL estático pueden fallar cuando se vuelven a enlazar
  • Es posible que parezca que las aplicaciones se ejecutan correctamente pero proporcionan un resultado diferente
(declaración-parámetro,...)
Identifica el número de parámetros de entrada de la función y especifica la modalidad, el nombre, el tipo de datos y el valor predeterminado opcional de cada parámetro. En la lista debe especificarse una única entrada por cada parámetro que la función espera recibir. Puede especificarse un máximo de 90 parámetros (SQLSTATE 54023).
Puede registrar una función que no tenga ningún parámetro; todavía será necesario codificar los paréntesis, sin indicar ningún tipo de datos. Por ejemplo:
   CREATE FUNCTION WOOFER() ...
Dos funciones con nombres idénticos en el mismo esquema no pueden tener el mismo tipo para todos los parámetros correspondientes. Las longitudes, precisiones y escalas no se consideran en esta comparación de tipos. Por esta razón, se considera que CHAR(8) y CHAR(35) tienen el mismo tipo, al igual que DECIMAL(11,2) y DECIMAL (4,3). Un tipo diferenciado de tipado débil especificado para un parámetro se considera del mismo tipo de datos que el tipo de origen del tipo diferenciado. Para una base de datos Unicode, se considera que CHAR(13) y GRAPHIC(8) son del mismo tipo. Hay una agrupación más profunda de los tipos que hace que se traten como el mismo tipo para esta finalidad como, por ejemplo, DECIMAL y NUMERIC. Una signatura duplicada devuelve un error (SQLSTATE 42723).
IN
Identifica el parámetro como un parámetro de entrada para la función. Los cambios que se realicen en el parámetro dentro de la función no estarán disponibles para el contexto de invocación cuando se devuelva el control.
nombre-parámetro
Especifica un nombre opcional para el parámetro. El nombre no puede ser el mismo que el de cualquier otro nombre-parámetro de la lista de parámetros (SQLSTATE 42734).
tipo-datos1
Especifica el tipo de datos del parámetro. El tipo de datos puede ser un tipo de datos incorporado. Para obtener una descripción más completa de cada tipo de datos incorporado, consulte Sentencia CREATE TABLE. El tipo de datos no debe ser XML, CLOB, DBCLOB o BLOB. (SQLSTATE 42815). El tipo de datos no debe ser un tipo distinct (SQLSTATE 42611).
DEFAULT
Especifica un valor por omisión para el parámetro. El valor por omisión puede ser una constante, un registro especial, una variable global, una expresión o la palabra clave NULL. Los registros especiales que se pueden especificar como el valor predeterminado son los mismos que los registros especiales que se pueden especificar para una columna predeterminada (véase cláusula-predeterminada en Sentencia CREATE TABLE). Se pueden especificar otros registros especiales como valor por omisión utilizando una expresión.

La expresión puede ser cualquier expresión del tipo que se describe en Expresiones. Si no se especifica un valor por omisión, el parámetro no tendrá ningún valor por omisión y no se podrá omitir el argumento correspondiente al invocar el procedimiento. El tamaño máximo de la expresión es 64 KB.

La expresión por omisión no debe modificar datos SQL (SQLSTATE 428FL o SQLSTATE 429BL). La expresión debe ser compatible con asignaciones con el tipo de datos del parámetro (SQLSTATE 42821).

RETURNS
Esta cláusula obligatoria identifica el resultado de la función.
tipo2-datos
Especifica el tipo de datos de la salida.

En este caso, se aplican exactamente las mismas consideraciones descritas en tipo1-datos para los parámetros de función.

El tipo de datos no debe ser un tipo distinct (SQLSTATE 42611).

tipo3-datos CAST FROM tipo4-datos
Especifica el tipo de datos de la salida.

Este formato de cláusula RETURNS se utiliza para devolver un tipo de datos diferente a la sentencia de invocación del tipo de datos que se ha devuelto por el código de función de la función. Ejemplo:

   CREATE FUNCTION GET_HIRE_DATE(CHAR(6))
     RETURNS DATE CAST FROM CHAR(10)
     ...

En el código anterior, el código de función devuelve un valor CHAR(10) al gestor de bases de datos. El gestor de bases de datos lo convierte en DATE y pasa dicho valor a la sentencia que realiza la invocación. El tipo-datos4 debe ser convertible al parámetro tipo-datos3. Si no es convertible, se devuelve un error (SQLSTATE 42880).

La longitud, precisión o escala para tipo-datos3 puede inferirse de tipo-datos4. Aunque puede especificar la longitud, precisión o escala para tipos parametrizados para tipo-datos, no es necesario. En lugar de eso, se pueden utilizar paréntesis vacíos. Por ejemplo, se puede utilizar VARCHAR(). No puede utilizarse FLOAT() (SQLSTATE 42601) puesto que el valor del parámetro indica tipos de datos diferentes (REAL o DOUBLE).

Los tipos distinct no son válidos como tipo especificado en tipo-datos3 o tipo-datos4 (SQLSTATE 42815).

La operación de conversión también está sujeta a comprobaciones durante la ejecución, que pueden dar como resultado errores de conversión.

tipo-incorporado
Consulte Sentencia CREATE TABLE para la descripción de los tipos de datos incorporados.
lista-opciones
SPECIFIC nombre-específico
Proporciona un nombre exclusivo para la instancia de la función que se está definiendo. Este nombre específico puede utilizarse cuando se utiliza esta función como fuente, al descartar la función o bien al comentarla. Nunca puede emplearse para invocar a la función. El formato no calificado de un nombre-específico es un identificador SQL. La forma calificada es un nombre-esquema seguido de un punto y un identificador de SQL. El nombre, incluido el calificador implícito o explícito, no debe identificar otra instancia de función ni especificación de método que exista en el servidor de aplicaciones; de lo contrario, se produce un error (SQLSTATE 42710).

El nombre-específico puede ser el mismo que un nombre-función ya existente.

Si no se especifica ningún calificador, se emplea el que se haya utilizado para el nombre-función. Si se especifica un calificador, debe ser el mismo calificador explícito o implícito del nombre-función o se devuelve un error (SQLSTATE 42882).

Si no se especifica el nombre-específico, el gestor de bases de datos genera un nombre exclusivo. El nombre exclusivo es SQL seguido de una indicación de fecha y hora en forma de serie caracteres: SQLaammddhhmmssxxx.

DETERMINISTIC o NOT DETERMINISTIC
Esta cláusula opcional especifica si la función siempre devuelve los mismos resultados para unos valores argumento determinados (DETERMINISTIC) o si la función depende de ciertos valores de estado que afectan a los resultados (NOT DETERMINISTIC). Es decir, una función DETERMINISTIC siempre debe devolver el mismo resultado para invocaciones sucesivas con entradas de datos idénticas. Con la especificación de NOT DETERMINISTIC, se evitan las optimizaciones que aprovechan el hecho de que las entradas idénticas siempre producen los mismos resultados. Un ejemplo de una función NOT DETERMINISTIC sería un generador de números aleatorios. Un ejemplo de una función DETERMINISTIC sería una función que determinara la raíz cuadrada de los datos de entrada. Si se especifica DETERMINISTIC, las rutinas INITIALIZE, ACCUMULATE, MERGE y FINALIZE que están identificadas también son DETERMINISTIC (SQLSTATE 428IA).
CALLED ON NULL INPUT
CALLED ON NULL INPUT siempre se aplica a las funciones de interfaz agregada. En otras palabras, la función se invoca independientemente de si el conjunto de valores del argumento son todos nulos. Los procedimientos INITIALIZE, ACCUMULATE y MERGE identificados también son siempre CALLED ON NULL INPUT ya que son procedimientos. La función FINALIZE identificada también debe ser CALLED ON NULL INPUT (SQLSTATE 428IA). Cualquier parámetro de las rutinas de componente puede devolver un valor nulo o un valor normal (no nulo). La responsabilidad para probar valores de argumentos nulos recae en la rutina del componente.
EXTERNAL ACTION o NO EXTERNAL ACTION
Especifica si la función tiene acciones que cambian el estado de un objeto que el gestor de bases de datos no puede gestionar. Un ejemplo de una acción externa es enviar un mensaje o grabar un registro en un archivo. El valor por omisión es EXTERNAL ACTION.
EXTERNAL ACTION
Especifica que la función tiene acciones que cambian el estado de un objeto que el gestor de bases de datos no puede gestionar.

Una función con acciones externas puede devolver resultados incorrectos si se ejecuta por tareas paralelas. Por ejemplo, si la función envía una nota para cada llamada inicial a esa función, se enviará una nota para cada tarea paralela, en lugar de una nota para la función.

NO EXTERNAL ACTION
Especifica que la función no tiene acciones que cambian el estado de un objeto que el gestor de bases de datos no puede gestionar. El gestor de bases de datos utiliza esta información durante la optimización de las sentencias de SQL. Si se especifica NO EXTERNAL ACTION, las rutinas INITIALIZE, ACCUMULATE, MERGE y FINALIZE identificadas también deben ser NO EXTERNAL ACTION (SQLSTATE 428IA).
NO SCRATCHPAD
Esta cláusula opcional se puede utilizar para especificar si se va a proporcionar una anotación para una función externa. Se permite NO SCRATCHPAD para una función de interfaz agregada. Los procedimientos INITIALIZE, ACCUMULATE, y MERGE identificados siempre tienen NO SCRATCHPAD ya que son procedimientos. La función FINALIZE identificada también debe ser NO SCRATCHPAD (SQLSTATE 428IA).
NO FINAL CALL
Esta cláusula opcional especifica si debe realizarse una llamada final a una función externa. Se permite NO FINAL CALL para una función de interfaz agregada. Los procedimientos INITIALIZE, ACCUMULATE y MERGE identificados son siempre NO FINAL CALL ya que son procedimientos. La función FINALIZE identificada también debe ser NO FINAL CALL (SQLSTATE 428IA).
ALLOW PARALLEL
Esta cláusula opcional especifica si, para una referencia individual a la función, puede paralelizarse la invocación de la función. Para las funciones de interfaz agregadas, sólo se soporta ALLOW PARALLEL.
NOT SECURED o SECURED
Especifica si la función se considera segura para el control de acceso a filas y columnas. El valor por omisión es NOT SECURED.
NOT SECURED
Indica que la función no se considera segura. Cuando se invoca la función, los argumentos de la función no deben hacer referencia a una columna para la que haya habilitada una máscara de columna y el control de acceso de nivel de columna esté activado para su tabla (SQLSTATE 428HA). Esta norma se aplica a las funciones definidas por el usuario no seguras que se invocan en algún punto de la sentencia.
SECURED
Indica que la función se considera segura.
AGGREGATE
Esta cláusula obligatoria indica que la sentencia CREATE FUNCTION se emplea para registrar una nueva función de agregación definida por el usuario.
WITH
Esta cláusula se utiliza para especificar las variables de estado disponibles entre las fases de proceso de la función de agregado. Debe haber al menos una variable de estado definida.
nombre-variable-estado
Especifica un nombre opcional para la variable de estado. El nombre no puede ser el mismo que cualquier otro nombre-variable-estado de la lista de variables de estado para esta definición de función (SQLSTATE 42734).
tipo-datos5
Especifica el tipo de variable de estado.

Las consideraciones que se aplican para los parámetros de funciones (como se describe en tipo-datos1) también se aplican para parámetros de función. Sin embargo, los tipos de datos XML, CLOB, DBCLOB y BLOB no se permiten como tipos de datos de variable de estado (SQLSTATE 42611). El tipo de datos para tipo-datos5 no debe ser un tipo distinct (SQLSTATE 42611).

El recuento de bytes totales de las variables de estado no pueden ser mayores de 32677 utilizando el método de tamaño de filas de tabla para contar bytes (SQLSTATE 42611).

USING
Esta cláusula obligatoria especifica cómo está implementado el proceso de la función de agregación. La cláusula USING especifica un conjunto de procedimientos definidos por el usuario y una función escalar definida por el usuario que implementa las fases del proceso de la función de agregación.
IN MODULE nombre-módulo
Esta cláusula opcional especifica que los tres procedimientos y la función que se especifican en las cláusulas INITIALIZE, ACCUMULATE, MERGE y FINALIZE están en el módulo nombre-módulo. Si se especifica esta cláusula, nombre-procedimiento, nombre-función o nombre-específico especificados en diseñador-procedimiento y diseñador-función deben ser nombres no calificados (SQLSTATE 42601).
INITIALIZE designador-procedimiento
Identifica excepcionalmente un procedimiento único que implementa la fase de inicialización de la agregación.

El procedimiento seleccionado debe tener únicamente parámetros de salida. El número de parámetros de salida debe ser el mismo que el número de variables de estado especificadas en la cláusula AGGREGATE WITH (SQLSTATE 428IA). El tipo de datos de cada parámetro de salida del procedimiento que está seleccionado debe tener exactamente el mismo tipo que el tipo de datos correspondiente especificado en la cláusula AGGREGATE WITH (SQLSTATE 428IA).

Especifique las siguientes combinaciones de opciones para el procedimiento seleccionado (SQLSTATE 428IA):
  • LANGUAGE C y NO SQL
  • LANGUAGE JAVA y NO SQL
  • LANGUAGE SQL y CONTAINS SQL

Este procedimiento debe existir cuando se ejecuta esta sentencia, a menos que el parámetro de configuración de base de datos AUTO_REVAL esté establecido en DEFERRED_FORCE.

ACCUMULATE designador-procedimiento
Identifica excepcionalmente un procedimiento único que implementa la fase de acumulación de la agregación.
El procedimiento seleccionado debe tener los siguientes criterios (SQLSTATE 428IA):
  • El procedimiento seleccionado debe tener primero el mismo número de parámetros sólo de entrada que el número de parámetros especificados en la función de agregación.
  • El procedimiento seleccionado debe tener el mismo número de parámetros INOUT que el número de variables de estado especificado en la cláusula AGGREGATE WITH.
El tipo de datos de cada parámetro sólo de entrada del procedimiento que está seleccionado debe tener el mismo tipo que el tipo de datos correspondiente especificado en declaración-parámetro (SQLSTATE 428IA). El tipo de datos de cada parámetro INOUT del procedimiento seleccionado debe tener exactamente el mismo tipo que el tipo de datos correspondiente especificado en la cláusula AGGREGATE WITH (SQLSTATE 428IA).
Especifique las siguientes combinaciones de opciones para el procedimiento seleccionado (SQLSTATE 428IA):
  • LANGUAGE C y NO SQL
  • LANGUAGE JAVA y NO SQL
  • LANGUAGE SQL y CONTAINS SQL

Este procedimiento debe existir cuando se ejecuta esta sentencia, a menos que el parámetro de configuración de base de datos AUTO_REVAL esté establecido en DEFERRED_FORCE.

MERGE designador-procedimiento
Identifica excepcionalmente un procedimiento único que implementa la fase de fusión de la agregación.
El procedimiento seleccionado debe tener los siguientes criterios (SQLSTATE 428IA):
  • El procedimiento seleccionado debe tener primero el mismo número de parámetros sólo de entrada que el número de variables de estado especificado en la cláusula AGGREGATE WITH.
  • El procedimiento seleccionado debe tener el mismo número de parámetros INOUT que el número de variables de estado especificado en la cláusula AGGREGATE WITH.
El tipo de datos de cada parámetro sólo de entrada del procedimiento que está seleccionado debe tener el mismo tipo de datos que el tipo de datos correspondiente especificado en la cláusula AGGREGATE WITH (SQLSTATE 428IA). El tipo de datos de cada parámetro INOUT del procedimiento seleccionado debe tener exactamente el mismo tipo que el tipo de datos correspondiente especificado en la cláusula AGGREGATE WITH (SQLSTATE 428IA).
Especifique las siguientes combinaciones de opciones para el procedimiento seleccionado (SQLSTATE 428IA):
  • LANGUAGE C y NO SQL
  • LANGUAGE JAVA y NO SQL
  • LANGUAGE SQL y CONTAINS SQL

Este procedimiento debe existir cuando se ejecuta esta sentencia, a menos que el parámetro de configuración de base de datos AUTO_REVAL esté establecido en DEFERRED_FORCE.

FINALIZE designador-función
Identifica exclusivamente una función escalar única definida por el usuario que implementa la fase de resultados final de la agregación.

La función seleccionada debe tener el mismo número de parámetros sólo de entrada que el número de variables de estado especificado en la cláusula AGGREGATE WITH (SQLSTATE 428IA). El tipo de datos de cada parámetro sólo de entrada de la función que está seleccionada debe tener el mismo tipo de datos que el tipo de datos correspondiente especificado en la cláusula AGGREGATE WITH (SQLSTATE 428IA). El tipo de datos de cada función seleccionada debe tener exactamente el mismo tipo que el tipo de datos de la salida especificado en la cláusula RETURNS WITH (SQLSTATE 428IA).

Especifique las siguientes combinaciones de opciones para el procedimiento seleccionado (SQLSTATE 428IA):
  • LANGUAGE C y NO SQL
  • LANGUAGE JAVA y NO SQL
  • LANGUAGE SQL y CONTAINS SQL

La función debe existir cuando se ejecuta esta sentencia, a menos que el parámetro de configuración de base de datos AUTO_REVAL esté establecido en DEFERRED_FORCE.

En las descripciones para las rutinas INITIALIZE, ACCUMULATE, MERGE y FINALIZE, el mismo tipo de datos significa que las longitudes, precisiones, escalas, unidades de serie y CCSID se tienen en cuenta en esta comparación de tipos. Por lo tanto, los siguientes tipos de datos se consideran diferentes:
  • CHAR(8) y CHAR(35)
  • VARCHAR(10 OCTETS) y VARCHAR(10 CODEUNIT32)
  • DECIMAL(11,2) y DECIMAL (4,3)

Un tipo diferenciado de tipado débil se considera un tipo de datos diferente al tipo de origen del tipo distinct. Se considera que CHAR(13) y GRAPHIC(13) son tipos diferentes incluso en una base de datos Unicode.

designador-procedimiento
PROCEDURE nombre-procedimiento
Identifica un procedimiento en particular y sólo es válido si existe exactamente una instancia de procedimiento con el nombre nombre-procedimiento en el esquema. Para el procedimiento identificado puede definirse cualquier número de parámetros. En las sentencias de SQL dinámico, el registro especial CURRENT SCHEMA se utiliza como calificador para un nombre de objeto no calificado. En las sentencias de SQL estático, la opción de precompilación/enlace QUALIFIER especifica implícitamente el calificador para los nombres de objeto no calificados. Si no existe ningún procedimiento con este nombre en el esquema nombrado o implícito, se genera un error (SQLSTATE 42704). Si existe más de una instancia del procedimiento en el esquema especificado o implícito, se devuelve un error (SQLSTATE 42725). Si existe un procedimiento con este nombre y el ID de autorización de la sentencia no tiene el privilegio EXECUTE en este procedimiento, se devuelve un error (SQLSTATE 42501).
PROCEDURE nombre-procedimiento (tipo-datos,...)
Proporciona la signatura del procedimiento, que identifica el procedimiento de forma exclusiva. No se utiliza el algoritmo de resolución de procedimiento.
nombre-procedimiento
Especifica el nombre del procedimiento. En las sentencias de SQL dinámico, el registro especial CURRENT SCHEMA se utiliza como calificador para un nombre de objeto no calificado. En las sentencias de SQL estático, la opción de precompilación/enlace QUALIFIER especifica implícitamente el calificador para los nombres de objeto no calificados.
(tipo-datos,...)
Los valores deben coincidir con los tipos de datos que se han especificado (en la posición correspondiente) en la sentencia CREATE PROCEDURE. Para identificar la instancia de procedimiento específica, se utilizan el número de tipos de datos y la concatenación lógica de los tipos de datos.

Si un tipo de datos no está calificado, el nombre del tipo se resuelve realizando una búsqueda en los esquemas de la vía de acceso de SQL.

No es necesario especificar la longitud, la precisión o la escala para los tipos de datos con parámetros. En lugar de ello, puede codificarse un conjunto de paréntesis vacío para indicar que esos atributos deben pasarse por alto durante la búsqueda de una coincidencia de tipo de datos.

FLOAT() no puede utilizarse (SQLSTATE 42601), ya que el valor del parámetro indica tipos de datos distintos (REAL o DOUBLE).

Si se codifica la longitud, la precisión o la escala, el valor debe coincidir exactamente con el valor especificado en la sentencia CREATE PROCEDURE. Cuando se especifica la longitud para los tipos de datos de serie gráfica o de caracteres, la unidad de serie del atributo de longitud debe coincidir de forma exacta con la especificada en la sentencia CREATE PROCEDURE.

Un tipo de FLOAT(n) no necesita coincidir con el valor definido para n porque 0 < n < 25 significa REAL, y 24 < n < 54 significa DOUBLE. La coincidencia se produce basándose en si el tipo es REAL o DOUBLE.

Si no existe ningún procedimiento con la firma especificada en el esquema nombrado o implícito, se devuelve un error (SQLSTATE 42883).

Si existe un procedimiento con esta firma de procedimiento y el ID de autorización de la sentencia no tiene el privilegio EXECUTE en este procedimiento, se devuelve un error (SQLSTATE 42501).

SPECIFIC PROCEDURE nombre-específico
Identifica un procedimiento en particular, utilizándose el nombre que se ha especificado o predeterminado durante el tiempo de creación del procedimiento. En las sentencias de SQL dinámico, el registro especial CURRENT SCHEMA se utiliza como calificador para un nombre de objeto no calificado. En las sentencias de SQL estático, la opción de precompilación/enlace QUALIFIER especifica implícitamente el calificador para los nombres de objeto no calificados. El nombre-específico debe identificar una instancia de procedimiento específica en el esquema nombrado o implícito; de lo contrario, se devuelve un error (SQLSTATE 42704). Si existe un procedimiento con este nombre específico y el ID de autorización de la sentencia no tiene el privilegio EXECUTE en este procedimiento, se devuelve un error (SQLSTATE 42501).
FUNCTION nombre-función
Identifica una función en particular y sólo es válido si existe exactamente una instancia de función con el nombre nombre-función en el esquema. Para la función identificada puede definirse cualquier número de parámetros. En las sentencias de SQL dinámico, el registro especial CURRENT SCHEMA se utiliza como calificador para un nombre de objeto no calificado. En las sentencias de SQL estático, la opción de precompilación/enlace QUALIFIER especifica implícitamente el calificador para los nombres de objeto no calificados. Si no existe ninguna función con este nombre en el esquema nombrado o implícito, se produce un error (SQLSTATE 42704). Si existe más de una instancia de la función en el esquema especificado o implícito, se devuelve un error (SQLSTATE 42725). Si existe una función con este nombre y el ID de autorización de la sentencia no tiene el privilegio EXECUTE en esta función, se devuelve un error (SQLSTATE 42501).
designador-función
FUNCTION nombre-funció (tipo-datos,...)
Proporciona la signatura de la función, que identifica la función de forma exclusiva. No se utiliza el algoritmo de resolución de función.
nombre-función
Especifica el nombre de la función. En las sentencias de SQL dinámico, el registro especial CURRENT SCHEMA se utiliza como calificador para un nombre de objeto no calificado. En las sentencias de SQL estático, la opción de precompilación/enlace QUALIFIER especifica implícitamente el calificador para los nombres de objeto no calificados.
(tipo-datos,...)
Los valores deben coincidir con los tipos de datos que se han especificado (en la posición correspondiente) en la sentencia CREATE FUNCTION. Para identificar la instancia de función específica, se utilizan el número de tipos de datos y la concatenación lógica de los tipos de datos.

Si un tipo de datos no está calificado, el nombre del tipo se resuelve realizando una búsqueda en los esquemas de la vía de acceso de SQL.

No es necesario especificar la longitud, la precisión o la escala para los tipos de datos con parámetros. En lugar de ello, puede codificarse un conjunto de paréntesis vacío para indicar que esos atributos deben pasarse por alto durante la búsqueda de una coincidencia de tipo de datos.

FLOAT() no puede utilizarse (SQLSTATE 42601), ya que el valor del parámetro indica tipos de datos distintos (REAL o DOUBLE).

Si se codifica la longitud, la precisión o la escala, el valor debe coincidir exactamente con el especificado en la sentencia CREATE FUNCTION. Cuando se especifica la longitud para los tipos de datos de serie gráfica o de caracteres, la unidad de serie del atributo de longitud debe coincidir de forma exacta con la especificada en la sentencia CREATE FUNCTION.

Un tipo de FLOAT(n) no necesita coincidir con el valor definido para n porque 0 < n < 25 significa REAL, y 24 < n < 54 significa DOUBLE. La coincidencia se produce basándose en si el tipo es REAL o DOUBLE.

Si no existe ninguna función con la signatura especificada en el esquema nombrado o implícito, se devuelve un error (SQLSTATE 42883).

Si existe una función con esta firma de función y el ID de autorización de la sentencia no tiene el privilegio EXECUTE en esta función, se devuelve un error (SQLSTATE 42501).

SPECIFIC FUNCTION nombre-específico
Identifica una función definida por el usuario en particular, utilizándose el nombre que se ha especificado o predeterminado durante la creación de la función. En las sentencias de SQL dinámico, el registro especial CURRENT SCHEMA se utiliza como calificador para un nombre de objeto no calificado. En las sentencias de SQL estático, la opción de precompilación/enlace QUALIFIER especifica implícitamente el calificador para los nombres de objeto no calificados. El nombre-específico debe identificar una instancia de función específica en el esquema nombrado o implícito; de lo contrario, se devuelve un error (SQLSTATE 42704). Si existe una función con este nombre-específico y el ID de autorización de la sentencia no dispone de privilegio EXECUTE para esta función, se devuelve un error (SQLSTATE 42501).

Notas

  • Privilegios: el definidor de una función siempre recibe el privilegio EXECUTE de la función. El definidor también recibe el derecho a descartar la función. El definidor de la función también recibe WITH GRANT OPTION si el definidor de la función tiene EXECUTE WITH GRANT OPTION en todas las rutinas de componente.

Ejemplos

  1. Definir una función de agregación que devuelva el promedio de un conjunto de valores numéricos, utilizando las rutinas Java.
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
     
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DOUBLE, INOUT sum DOUBLE, INOUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_accumulate';
    
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DOUBLE, IN count INT, 
          INOUT mergesum DOUBLE, INOUT mergecount INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_merge';
    
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DOUBLE, count INT)
       RETURNS DECFLOAT(34)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_finalize';
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DECFLOAT(34)
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
  2. Definir una función de agregado con nombres de procedimiento y función que no están calificados. Definir una función de agregación bajo el esquema FOO. Invocar la función de agregación bajo la BAR de esquema.
    SET SCHEMA FOO;
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
    
    SET SCHEMA BAR;
    
    SELECT FOO.myavg(c1) FROM t1;
    El gestor de bases de datos busca procedimientos con los nombres de FOO.myavg_initialize, FOO.myavg_accumulate, FOO.myavg_merge y la función con el nombre de FOO.myavg_finalize para la invocación de FOO.myavg.
  3. Definir una función de agregado con nombres de función y procedimiento específicos que no están calificados. Definir una función de agregación bajo el esquema FOO. Invocar la función de agregación bajo la BAR de esquema.
    SET SCHEMA FOO;
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize1
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate1
       MERGE SPECIFIC PROCEDURE myavg_merge1
       FINALIZE SPECIFIC FUNCTION myavg_finalize1;
    
    SET SCHEMA BAR;
    
    SELECT FOO.myavg(c1) FROM t1;
    El gestor de bases de datos busca procedimientos con los nombres de FOO.myavg_initialize1, FOO.myavg_accumulate1, FOO.myavg_merge1 y la función con el nombre específico de FOO.myavg_finalize1 para la invocación de FOO.myavg.
  4. Definir una función de agregación sin algunas de las rutinas de componente. La función de agregación se creará como no válida y se invocará la revalidación en el siguiente acceso.
    UPDATE DB CFG USING AUTO_REVAL DEFERRED_FORCE;
    
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
     
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DOUBLE, INOUT sum DOUBLE, INOUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_accumulate';
    
    -- faltan la fusión y finalización de la rutina de componente, la creación es correcta y myavg no es válido:
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE  PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
    
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DOUBLE, IN count INT, 
          INOUT mergesum DOUBLE, INOUT mergecount INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_merge';
    
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DOUBLE, count INT)
       RETURNS DOUBLE
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_finalize';
    
    -- se invocará la revalidación de myavg y será correcta
    SELECT myavg(c1) FROM t1;
  5. Definir una función de agregación utilizando una variable global como valor predeterminado para su parámetro. Descartar la variable global invalida la función.
    CREATE VARIABLE gv1 DOUBLE;
    
    -- crear las 4 rutinas de componente (myavg_initialize,
    myavg_accumulate,
    myavg_merge, myavg_finalize) como el Ejemplo 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(p1 DOUBLE DEFAULT gv1)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- la siguiente sentencia invalida la función 'myavg'
    DROP VARIABLE gv1;
  6. Definir una función de agregado cuyas rutinas de componente utilizan una variable global como valor predeterminado para su parámetro. Descartar la variable local invalida la rutina de componente y la función de agregación.
    CREATE VARIABLE gv1 INT;
    
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT DEFAULT gv1)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- crear las 3 rutinas de componente restantes
    (myavg_accumulate,
    myavg_merge, myavg_finalize) como el Ejemplo 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- la siguiente sentencia invalida la rutina 'myavg_initialize' y la
    función 'myavg'
    DROP VARIABLE gv1;
  7. Definir una función de agregación, a continuación, crear un procedimiento que llama a la función de agregación. A continuación, descartar o sustituir una de las rutinas de componente. Cualquier acción invalida la función de agregación y el procedimiento que la llama.
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL 
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- crear las 3 rutinas de componente restantes
    (myavg_accumulate,
    myavg_merge, myavg_finalize) como el Ejemplo 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    CREATE OR REPLACE PROCEDURE myproc (OUT p1 DOUBLE)
    BEGIN
       SET p1 = (SELECT myavg(c1) FROM t1);
    END;
    
    -- descartar la rutina de componente
    -- esta acción invalida la función de agregación 'myavg' y el
    procedimiento 'myproc' que la llama:
    DROP PROCEDURE myavg_initialize;
     
    -- volver a crear la rutina de componente
    -- igual que la sentencia DROP, esta acción invalida la función
    de agregación 'myavg' y el procedimiento 'myproc' que la llama:
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE C PARAMETER STYLE C
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize_C_version';
    
    -- la revalidación se invoca la siguiente vez que se accede a 'myproc'
    -- la función de agregación 'myavg' y el procedimiento 'myproc' se
    revalidan
    CALL myproc(?); 
  8. Utilice el parámetro de configuración de base de datos AUTO_REVAL para controlar la semántica de validación e invalidación.
    UPDATE DB CFG USING AUTO_REVAL DEFERRED_FORCE;
    
    -- la variable global 'gv1' no existe; se puede crear
    el procedimiento 'myavg_initialize', pero no es válido
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT default gv1)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- crear las 3 rutinas de componente restantes
    (myavg_accumulate,
    myavg_merge, myavg_finalize) como el Ejemplo 1
    ...
    ...
    ...
    
    -- se puede crear la función 'myavg', pero no es válida 
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS mydouble
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- crear la variable global 'gv1'
    CREATE VARIABLE gv1 DOUBLE;
    
    -- se ha invocado la revalidación de la función 'myavg' y del
    procedimiento 'myavg_initialize'; la revalidación ha tenido éxito
    SELECT myavg(c1) FROM t1;
    
    -- cambiar el valor del parámetro de configuración de base de datos
    AUTO_REVAL a IMMEDAITE
    UPDATE DB CFG USING AUTO_REVAL IMMEDIATE;
    
    -- la sentencia CREATE OR REPLACE VARIABLE invoca la revalidación
    para la función 'myavg' y el procedimiento 'myavg_initialize'
    CREATE OR REPLACE VARIABLE gv1 DOUBLE DEFAULT 1.0;
  9. Cree una función de agregación que utilice rutinas SQL para calcular y devolver el promedio de un conjunto de valores numéricos.
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DECFLOAT, OUT count INT)
    LANGUAGE SQL
    CONTAINS SQLBEGIN
    
      SET sum = 0;
      SET count = 0;
    
    END @
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DECFLOAT, INOUT sum DECFLOAT, INOUT count INT)
    LANGUAGE SQL
    CONTAINS SQLBEGIN
    
      SET sum = sum + input;
      SET count = count + 1;
    
    END @
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DECFLOAT, IN count INT,
    INOUT mergesum DECFLOAT, INOUT mergecount INT)
    LANGUAGE SQL
    CONTAINS SQLBEGIN
    
      SET mergesum = sum + mergesum;
      SET mergecount = count + mergecount;
    
    END @
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DECFLOAT, count INT)
    LANGUAGE SQL
    CONTAINS SQLRETURNS DECFLOAT(34)
    BEGIN
    
      RETURN (sum /  count);
    
    END @
    CREATE OR REPLACE FUNCTION myavg(DECFLOAT)
    RETURNS DECFLOAT(34)
    AGGREGATE WITH (sum DECFLOAT, count INT)
    USING
    INITIALIZE PROCEDURE myavg_initialize
    ACCUMULATE PROCEDURE myavg_accumulate
    MERGE PROCEDURE myavg_merge
    FINALIZE FUNCTION myavg_finalize
    @