Sentencia CREATE FUNCTION (derivado o plantilla)

La sentencia CREATE FUNCTION (derivada o plantilla) se utiliza para registrar una función o plantilla de función con un servidor.

Esta sentencia puede registrar los objetos siguientes:
  • Una función definida por el usuario, basada en otra función escalar o agregada existente, en el servidor actual.
  • Una plantilla de función en un servidor de aplicaciones que esté designado como servidor federado. Una plantilla de función es una función parcial que no contiene código ejecutable. El usuario lo crea con la finalidad de correlacionarlo con una función fuente de datos. Después de crear la correlación, el usuario puede especificar la plantilla de función en consultas que se envían al servidor federado. Cuando se procesa una consulta como esta, el servidor federado invocará la función fuente de datos a la que está asignada la plantilla y devolverá los valores cuyos tipos de datos correspondan con los de la opción RETURNS de la definición de la plantilla.

Invocación

Esta sentencia se puede incorporar a un programa de aplicación o emitir mediante el uso de 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 debe tener al menos una de las autorizaciones siguientes:
  • Autorización IMPLICIT_SCHEMA en la base de datos, si el nombre de esquema implícito o explícito de la función no existe
  • El privilegio CREATEIN para el esquema, si existe el nombre de esquema de la función
  • Autoridad SCHEMAADM en el esquema, si existe el nombre de esquema de la función
  • Autorización DBADM

Los privilegios del ID de autorización de la sentencia también deben incluir el privilegio EXECUTE sobre la función fuente o el privilegio EXECUTEIN en el esquema que contiene la función de origen si el ID de autorización de la sentencia no tiene autorización DATAACCESS o autorización DATAACCESS en el esquema y se especifica la cláusula SOURCE.

Los privilegios de grupo para cualquier tabla o vista especificada en la sentencia CREATE FUNCTION no se tienen en cuenta.

Sintaxis

Leer el esquema de sintaxisOmitir el esquema de sintaxis visualCREATE FUNCTIONnombre-función( ,declaración-parámetro )?RETURNStipo2-datos?SPECIFICnombre-específico? SOURCE nombre-funciónSPECIFICnombre-específiconombre-función(,tipo-datos)PARAMETER CCSIDASCIIUNICODEAS TEMPLATE?NOT DETERMINISTICDETERMINISTIC?EXTERNAL ACTIONNO EXTERNAL ACTION?
declaración-parámetro
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual nombre-parámetro tipo1-datos cláusula-por-omisión
tipo1-datos, tipo2-datos
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualtipo-incorporadonombre-tipo-diferenciadonombre-tipo-estructurado
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 visualDEFAULT NULLconstanteregistro-especialvariable-global(expresión)
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

nombre-función
Identifica la función o plantilla de función que se está 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 sentencias de SQL estático, la opción de precompilación/vinculación QUALIFIER especifica de forma implícita 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, incluidos los calificadores implícitos y explícitos, junto con 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) no debe identificar una función ni una plantilla de función descritos en el catálogo (SQLSTATE 42723). El nombre no calificado, junto con el número y el tipo de datos de los parámetros, que por supuesto es exclusivo en su esquema, no es necesario que lo sea 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.

Al nombrar una función definida por el usuario que tenga su fuente en una función ya existente con el fin de dar soporte a la misma función con un tipo diferenciado definido por el usuario, puede utilizarse el mismo nombre que el de la función derivada. De esta forma, los usuarios pueden utilizar la misma función con un tipo diferenciado definido por el usuario sin darse cuenta de que era necesaria una definición adicional. En general, puede utilizarse el mismo nombre para más de una función si existe alguna diferencia en la signatura de las funciones.

(declaración-parámetro,...)
Identifica el número de parámetros de entrada de la función o plantilla de función y especifica el tipo de datos y el valor por omisión opcional de cada parámetro. Debe especificarse una entrada de la lista para cada parámetro que la función o plantilla de función espera recibir. No se permiten más de 90 parámetros (SQLSTATE 54023).
Existe la posibilidad de registrar una función que no tenga ningún parámetro. En este caso, sigue siendo necesaria la codificación de los paréntesis, sin incluir ningún tipo de datos. Por ejemplo:
   CREATE FUNCTION WOOFER() ...

En un esquema, no se permite que dos funciones que se denominen igual tengan exactamente el mismo tipo para todos los parámetros correspondientes. Esta restricción también es aplicable a una función y una plantilla de función con el mismo nombre en el mismo esquema. 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). Se considera que la especificación de un tipo diferenciado con tipo no firme es del mismo tipo de datos que el tipo de fuente 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).

nombre-parámetro
Especifica un nombre opcional para el parámetro de entrada. El nombre no puede ser el mismo que el de cualquier otro nombre-parámetro de la lista de parámetros (SQLSTATE 42734).
tipo1-datos
Especifica el tipo de datos del parámetro de entrada. El tipo de datos puede ser un tipo de datos incorporado, un tipo diferenciado o un tipo estructurado.

Se puede utilizar cualquier tipo de datos SQL válido si éste se puede convertir en el tipo del parámetro correspondiente de la función identificada en la cláusula SOURCE (para obtener información consulte Conversiones entre tipos de datos). Sin embargo, esta comprobación no garantiza que no se vaya a producir un error cuando se invoque la función.

Para obtener una descripción más completa de cada tipo de datos incorporado, consulte CREATE TABLE.

  • Un parámetro de tipo fecha y hora se pasa como tipo de datos de tipo carácter y los datos se pasan en formato ISO.
  • No se pueden especificar tipos de matriz (SQLSTATE 42879).
  • No se puede especificar un tipo de referencia especificado como REF(nombre-tipo) (SQLSTATE 42879).

Para un tipo diferenciado definido por el usuario, los atributos de longitud, precisión o escala para el parámetro son los del tipo fuente del tipo diferenciado (los especificados en CREATE TYPE). Un parámetro de tipo diferenciado se pasa como tipo fuente del tipo diferenciado. Si el nombre del tipo diferenciado no está calificado, el gestor de base de datos resuelve el nombre de esquema buscando los esquemas en la vía de acceso de SQL.

Para un tipo estructurado definido por el usuario, deben existir las funciones de transformación apropiadas en el grupo de transformación asociado.

Puesto que la función es derivada, no es necesario (pero se permite) especificar la longitud, la precisión o la escala para los tipos de datos con parámetros. Pueden utilizarse paréntesis vacíos en su lugar; por ejemplo, CHAR(). Un tipo de datos con parámetros es cualquiera de los tipos de datos que se pueden definir con una longitud, escala o precisión específicas. Los tipos de datos con parámetros son los tipos de datos de serie, los tipos de datos decimales y el tipo de datos TIMESTAMP.

También se pueden utilizar paréntesis vacíos con una plantilla de función en lugar de especificar la longitud, la precisión o la escala para los tipos de datos con parámetros. Se recomienda utilizar paréntesis vacíos para los tipos de datos con parámetros. Si utiliza paréntesis vacíos, la longitud, la precisión o la escala son iguales que las de la función remota, que se determina cuando se correlaciona la plantilla de función con una función remota mediante la creación de una correlación de función. Si omite los paréntesis, se utiliza la longitud por omisión para el tipo de datos (vea CREATE TABLE).

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 por omisión son los mismos que se pueden especificar para un valor por omisión de columna (véase cláusula-por-omisión en la 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 el apartado "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 de 64 K bytes.

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).

No se puede especificar un valor por omisión para un parámetro del tipo ARRAY, ROW o CURSOR (SQLSTATE 429BB).

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

Con una función escalar derivada, se acepta cualquier tipo de datos SQL válido, como un tipo diferenciado, siempre que se pueda convertir desde el tipo del resultado de la función fuente. Un tipo de matriz no puede especificarse como tipo de datos de un parámetro (SQLSTATE 42879).

El parámetro de un tipo con parámetros no es necesario especificarlo para los parámetros de una función derivada. En su lugar, pueden utilizarse paréntesis vacíos; por ejemplo, VARCHAR().

Para obtener información acerca de las consideraciones y normas adicionales que se aplican a la especificación del tipo de datos en la cláusula RETURNS cuando la función tiene su fuente en otra función, consulte el apartado Normas de esta sentencia.

Con una plantilla de función, los paréntesis vacíos no están permitidos (SQLSTATE 42611). Se debe especificar la longitud, la precisión o la escala para los tipos de datos con parámetros. Se recomienda especificar la misma longitud, precisión o escala que las de la función remota.

tipo-incorporado
Consulte en "CREATE TABLE" la descripción de los tipos de datos incorporados.
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 que exista en el servidor de aplicaciones; de lo contrario, se devuelve 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.

SOURCE
Especifica que la nueva función se va a definir como función derivada. Una función derivada se implementa mediante otra función (la función fuente). La función debe ser una función escalar o agregada que existe en el servidor actual, y debe ser de uno de los tipos siguientes:
  • Una función que se definió con una sentencia CREATE FUNCTION
  • Una función de conversión generada por una sentencia CREATE TYPE
  • Una función incorporada
Si la función fuente no es una función incorporada, la función concreta se puede identificar por su nombre, signatura de función o nombre específico.
Si la función fuente es una función incorporada, la cláusula SOURCE debe incluir una signatura de función para la función incorporada. La función fuente no debe ser ninguna de las funciones incorporadas siguientes (si se indica una sintaxis concreta, no se puede especificar únicamente el formato indicado):
  • CARDINALITY
  • CHAR cuando se especifica más de un parámetro y el primer parámetro es un tipo de datos de fecha y hora
  • CHARACTER_LENGTH con el parámetro de unidades de serie
  • COALESCE
  • CONTAINS
  • CURSOR_ROWCOUNT
  • DATAPARTITIONNUM
  • DBPARTITIONNUM
  • DEREF
  • EXTRACT
  • GRAPHIC cuando se especifica más de un parámetro y el primer parámetro es un tipo de datos de fecha y hora
  • GREATEST
  • HASHEDVALUE
  • INSERT con el parámetro de unidades de serie
  • INSTR con el parámetro de unidades de serie
  • LCASE con el parámetro de unidades de serie
  • LEAST
  • LEFT con el parámetro de unidades de serie
  • LENGTH con el parámetro de unidades de serie
  • LOCATE con el parámetro de unidades de serie
  • LOCATE_IN_STRING con el parámetro de unidades de serie
  • LOWER con el parámetro de unidades de serie
  • MAX
  • MAX_CARDINALITY
  • MIN
  • NODENUMBER
  • NULLIF
  • NVL
  • OVERLAY con el parámetro de unidades de serie
  • PARAMETER
  • POSITION con el parámetro de unidades de serie
  • RAISE_ERROR
  • REC2XML
  • RID
  • RID_BIT
  • RIGHT con el parámetro de unidades de serie
  • SCORE
  • STRIP
  • SUBSTRING con el parámetro de unidades de serie
  • TRIM
  • TRIM_ARRAY
  • TYPE_ID
  • TYPE_NAME
  • TYPE_SCHEMA
  • UCASE con el parámetro de unidades de serie
  • UPPER con el parámetro de unidades de serie
  • VALUE
  • VARCHAR cuando se especifica más de un parámetro y el primer parámetro es un tipo de datos de fecha y hora
  • VARGRAPHIC cuando se especifica más de un parámetro y el primer parámetro es un tipo de datos de fecha y hora
  • XMLATTRIBUTES
  • XMLCOMMENT
  • XMLCONCAT
  • XMLDOCUMENT
  • XMLELEMENT
  • XMLFOREST
  • XMLNAMESPACES
  • XMLPARSE
  • XMLPI
  • XMLQUERY
  • XMLROW
  • XMLSERIALIZE
  • XMLTEXT
  • XMLVALIDATE
  • XMLXSROBJECTID
  • XSLTRANSFORM
nombre-función

Identifica la función a utilizar como origen. Válida sólo si este nombre es exclusivo dentro del esquema y el ID de autorización tiene autorización DATAACCESS en el esquema, el privilegio EXECUTEIN en el esquema o el privilegio EXECUTE en la función. Esta variante de sintaxis no es válida para una función fuente que sea una función incorporada.

Si proporciona un nombre no calificado, se utilizará la vía de acceso de SQL para ubicar la función. Este es el valor del registro especial CURRENT PATH. Se selecciona el primer esquema en la vía de acceso de SQL que tiene este nombre de función y cuyo ID de autorización tiene autoridad DATAACCESS en el esquema, el privilegio EXECUTEIN en el esquema o el privilegio EXECUTE en la función.

La base de datos devolverá el error SQLSTATE 42704 para cada uno de los casos siguientes:
  • si no existe ninguna función con este nombre en el esquema nombrado
  • el nombre no es válido
  • no hay ninguna función con este nombre en la vía de acceso de SQL

La base de datos devolverá el error SQLSTATE 42725 si hay más de una instancia autorizada de la función en el esquema nombrado o ubicado.

La base de datos devolverá el error SQLSTATE 42501 si existe una función con este nombre pero el ID de autorización de la sentencia no tiene el privilegio EXECUTE, el privilegio EXECUTEIN o la autorización DATAACCESS en el esquema de la función.

SPECIFIC nombre-específico
Identifica una función determinada definida por el usuario que debe servir como fuente, por el nombre-específico ya sea especificado o tomado por omisión en el tiempo de creación de la función. Esta variante de sintaxis no es válida para una función fuente que sea una función incorporada.

Si se proporciona un nombre no calificado, se utiliza la vía de acceso SQL actual para localizar la función. El primer esquema de la vía de acceso de SQL que tiene una función con este nombre específico para la que el ID de autorización de la sentencia dispone de privilegio EXECUTE o del privilegio EXECUTEIN o la autorización DATAACCESS en el esquema está seleccionado.

Si no existe ninguna función para este nombre-específico en el esquema nombrado o si el nombre no está calificado y no hay ninguna función con este nombre-específico en la vía de acceso SQL, 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, o el privilegio EXECUTEIN o la autorización DATAACCESS de esquema, se devuelve un error (SQLSTATE 42501).

nombre-función (tipo-datos,...)
Proporciona la signatura de la función, que identifica de manera exclusiva la función fuente. Esta es la única variante de sintaxis válida para una función fuente que es una función incorporada.

Las normas para la resolución de funciones se aplicarán con el fin de seleccionar una función entre las funciones que tienen el mismo nombre de función, según los tipos de datos que se han especificado en la cláusula SOURCE. Sin embargo, el tipo de datos de cada parámetro de la función seleccionada debe tener exactamente el tipo de datos correspondiente que se ha especificado en la función fuente.

nombre-función
Constituye el nombre de la función fuente. Si se proporciona un nombre no calificado, entonces se tienen en cuenta los esquemas de la vía de acceso a SQL del usuario.
tipo-datos
Debe coincidir con el tipo de datos que se haya especificado en la sentencia CREATE FUNCTION en la posición correspondiente (separado por comas).

Para los tipos de datos con parámetros no es necesario especificar la longitud, la precisión ni la escala. En su lugar, puede haber un conjunto vacío de paréntesis codificados para indicar que esos atributos deben ignorarse al buscar una coincidencia del tipo de datos. Por ejemplo, DECIMAL() coincidirá con un parámetro cuyo tipo de datos esté definido como DECIMAL(7,2)).

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

De todas formas, si la longitud, la precisión o la escala están codificadas, el valor debe coincidir exactamente con el que se especifica en la sentencia CREATE FUNCTION. Puede ser útil para asegurarse de que se va a utilizar la función que desea. Tenga en cuenta que los sinónimos de los tipos de datos también se considerarán una coincidencia (por ejemplo, DEC y NUMERIC coincidirán).

No es necesario que un tipo FLOAT(n) coincida 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).

PARAMETER CCSID
Especifica el esquema de codificación que se debe utilizar para todos los datos de serie que se pasan a la función y desde ella. Si no se especifica la cláusula PARAMETER CCSID, el valor por omisión es PARAMETER CCSID UNICODE para las bases de datos Unicode y PARAMETER CCSID ASCII para todas las demás bases de datos.
ASCII
Especifica que los datos de serie están codificados en la página de códigos de la base de datos. Si la base de datos es Unicode, no se puede especificar PARAMETER CCSID ASCII (SQLSTATE 56031). Cuando se invoca la función, la página de códigos de la aplicación para la función es la página de códigos de la base de datos.
UNICODE
Especifica que los datos de serie están codificados en Unicode. Si la base de datos es Unicode, los datos de caracteres están en UTF-8 y los datos gráficos están en UCS-2. Si la base de datos no es Unicode, los datos de caracteres están en UTF-8. En cualquier caso, cuando se invoca la función, la página de códigos de la aplicación para la función es 1208.

La cláusula PARAMETER CCSID debe especificar el mismo esquema de codificación que la función fuente (SQLSTATE 53090).

AS TEMPLATE
Indica que esta sentencia se utilizará para crear una plantilla de función y no una función con código ejecutable.
NOT DETERMINISTIC o DETERMINISTIC
Especifica si la función devuelve los mismos resultados para argumentos de entrada idénticos. El valor por omisión es NOT DETERMINISTIC.
NOT DETERMINISTIC
Especifica que es posible que la función no devuelva el mismo resultado cada vez que la función se invoque con los mismos argumentos de entrada. La función depende de algunos valores de estado que afectan a los resultados. El gestor de bases de datos utiliza esta información durante la optimización de las sentencias de SQL. Un ejemplo de una función que no es determinante es la que genera números aleatorios.

Una función que no es determinante puede recibir resultados incorrectos si se ejecuta por tareas paralelas.

DETERMINISTIC
Especifica que la función siempre devuelve el mismo resultado cada vez que se invoca con los mismos argumentos de entrada. El gestor de bases de datos utiliza esta información durante la optimización de las sentencias de SQL. Un ejemplo de función determinante es la que calcula la raíz cuadrada del argumento de entrada.
EXTERNAL ACTION o NO EXTERNAL ACTION
Especifica si la función puede realizar una acción que cambie el estado de un objeto que el gestor de bases de datos no gestiona. 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 realiza una acción que cambia el estado de un objeto que el gestor de bases de datos no gestiona. EXTERNAL ACTION se debe especificar implícita o explícitamente si el cuerpo de la rutina de SQL invoca una función que está definida con EXTERNAL ACTION (SQLSTATE 428C2).

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 realiza ninguna acción que cambie el estado de un objeto que el gestor de bases de datos no gestiona. El gestor de bases de datos utiliza esta información durante la optimización de las sentencias de SQL.

Normas

  • Para que resulte más sencillo, en esta sección denominaremos CF a la función que se está creando, y denominaremos FS a la función identificada en la cláusula SOURCE, con independencia de cuál de las tres sintaxis permitidas se ha utilizado para identificar a FS.
    • El nombre no calificado de la función CF y el nombre no calificado de la SF pueden ser distintos.
    • Una función nombrada como la fuente de otra función puede, a su vez, utilizar otra función como su fuente. Se deben extremar las precauciones al utilizar este recurso ya que podría ser muy difícil depurar una aplicación si una función invocada indirectamente devuelve un error.
    • Si se especifican con la cláusula SOURCE, ninguna de las cláusulas siguientes es válida (porque la CF heredará estos atributos de la SF):
      • CAST FROM ...,
      • EXTERNAL ...,
      • LANGUAGE ...,
      • PARAMETER STYLE ...,
      • DETERMINISTIC / NOT DETERMINISTIC,
      • FENCED / NOT FENCED,
      • RETURNS NULL ON NULL INPUT / CALLED ON NULL INPUT
      • EXTERNAL ACTION / NO EXTERNAL ACTION
      • NO SQL / CONTAINS SQL / READS SQL DATA
      • SCRATCHPAD / NO SCRATCHPAD
      • FINAL CALL / NO FINAL CALL
      • RETURNS TABLE (...)
      • CARDINALITY ...
      • ALLOW PARALLEL / DISALLOW PARALLEL
      • DBINFO / NO DBINFO
      • THREADSAFE / NOT THREADSAFE
      • INHERIT SPECIAL REGISTERS

    Si se incumplen estas normas se produce un error (SQLSTATE 42613).

  • El número de parámetros de entrada en CF debe ser igual a los de SF; de lo contrario, se devuelve un error (SQLSTATE 42624).
  • La CF no tendrá que especificar necesariamente la longitud, precisión ni escala para un tipo de datos con parámetros en los casos siguientes:
    • Los parámetros de entrada de la función.
    • Su parámetro RETURNS

    En su lugar, se pueden especificar parámetros vacíos como parte del tipo de datos (por ejemplo: VARCHAR() ), para mostrar que la longitud/precisión/escala serán las mismas que las de la función fuente o las determinadas por la conversión del tipo de datos.

    No obstante, si se especifica la longitud, la precisión o la escala, el valor de la CF se comprueba comparándolo con el valor correspondiente de la SF, tal y como se explica en las normas restantes para los parámetros de entrada, y se devuelve un valor.

  • La especificación de los parámetros de entrada de la CF se comprueban respecto a los de la SF. El tipo de datos de cada parámetro de CF debe ser el mismo que el tipo de datos del parámetro correspondiente de la SF o debe ser convertible a él. Si algún parámetro no es del mismo tipo o no se puede convertir, se devuelve un error (SQLSTATE 42879).

    Tenga en cuenta que esta norma no proporciona ninguna garantía frente a los errores producidos al utilizar la CF. Un argumento que coincide con el tipo de datos y los atributos de longitud o de precisión de un parámetro de la CF, tal vez no sea asignable si el parámetro correspondiente de la SF tiene una longitud inferior o una precisión menor. Generalmente, los parámetros de la CF no deben tener atributos de longitud o de precisión superiores a los de los parámetros correspondientes de la SF.

  • Las especificaciones del tipo de datos RETURNS de la CF se comparan con las de la SF. El tipo de datos final RETURNS de la SF, tras la conversión que sea, debe ser el mismo o bien ser convertible al tipo de datos RETURNS de la CF. De lo contrario, se devuelve un error (SQLSTATE 42866).

    Tenga en cuenta que esta norma no proporciona ninguna garantía frente a los errores producidos al utilizar la CF. Un valor de resultado que coincide con el tipo de datos y los atributos de longitud y de precisión del tipo de datos RETURNS de la SF, tal vez no sea asignable si el tipo de datos RETURNS de la CF tiene una longitud inferior o una precisión menor. Debe tenerse precaución al especificar el tipo de datos RETURNS de la CF con atributos de precisión o longitud inferiores a los atributos del tipo de datos RETURNS de la SF.

  • No se admite la revalidación de CF que no tiene un parámetro con una expresión predeterminada (SQLSTATE 42997).

Notas

  • La determinación de si un tipo de datos es convertible a otro no tiene en cuenta la longitud, precisión ni escala de los tipos de datos con parámetros, como son CHAR y DECIMAL. Por esta razón, pueden producirse errores al utilizar una función como resultado del intento de conversión de un valor del tipo de datos fuente a un valor del tipo de datos de destino. Por ejemplo, VARCHAR es convertible a DATE, pero si el tipo de fuente está realmente definido como VARCHAR(5), al utilizar la función se producirá un error.
  • Al elegir los tipos de datos para los parámetros de una función definida por el usuario, tenga en cuenta las normas de promoción que afectarán a sus valores de entrada (consulte el apartado Promoción de tipos de datos). Por ejemplo, una constante que puede utilizarse como un valor de entrada puede tener un tipo de datos incorporado diferente al que se espera y, lo que es más significativo, es posible que no se promueva al tipo de datos que se espera. De acuerdo con las normas para la promoción, suele aconsejarse la utilización de los siguientes tipos de datos para parámetros:
    • INTEGER en lugar de SMALLINT
    • DOUBLE en lugar de REAL
    • VARCHAR en lugar de CHAR
    • VARGRAPHIC en lugar de GRAPHIC
  • La creación de una función con un nombre de esquema que todavía no existe dará como resultado la creación implícita de ese esquema siempre que el ID de autorización de la sentencia disponga de autorización IMPLICIT_SCHEMA. El propietario del esquema es SYSIBM. El privilegio CREATEIN sobre el esquema se otorga a PUBLIC.
  • Para que un servidor federado reconozca una función fuente de datos, la función debe estar correlacionada con una función complementaria en la base de datos federada. Si la base de datos no contiene ninguna función complementaria, el usuario debe crearla y luego definir la correlación.

    La función complementaria puede ser una función (escalar o fuente) o una plantilla de función. Si el usuario crea una función y la correlación necesaria, cada vez que se procesa una consulta que especifica la función, el gestor de bases de datos (1) compara las estrategias para invocarla con estrategias para invocar la función de origen de datos y (2) invoca la función que se prevé que necesitará menos recursos.

    Si el usuario crea una plantilla de función y la correlación, cada vez que se procesa una consulta que especifica la plantilla, el gestor de bases de datos invoca la función de origen de datos con la que se correlaciona, a condición de que exista un plan de acceso para invocar esta función.

  • Privilegios: el definidor de una función siempre recibe el privilegio EXECUTE de la función, así como el derecho de descartar la función. El usuario que define la función también recibe WITH GRANT OPTION si se aplica cualquiera de las condiciones siguientes:
    • La función fuente es una función incorporada.
    • El usuario que define la función dispone de EXECUTE WITH GRANT OPTION para la función fuente.
    • El usuario que define la función dispone de EXECUTEIN WITH GRANT OPTION en el esquema para la función fuente.
    • La función es una plantilla.
  • Funciones EXTERNAL ACTION: Si se invoca una función EXTERNAL ACTION en otra lista que no sea la lista de selección más externa, los resultados son imprevisibles, ya que el número de veces que se invoca la función variará en función del plan de acceso utilizado.
  • Establecimiento del valor por omisión: los parámetros de una función que están definidos con un valor por omisión se establecen en su valor por omisión cuando se invoca la función, aunque sólo si no se suministra un valor para el argumento correspondiente o se especifica como DEFAULT, cuando se invoca la función.
  • CREATE FUNCTION MAPPING con funciones de tabla o fila: las correlaciones de creación de función con funciones remotas que devuelven una tabla o una fila no están soportadas en las bases de datos federadas.
  • Herencia de los atributos SECURED o NOT SECURED de la función fuente: la función derivada definida por el usuario hereda el atributo SECURED o NOT SECURED de la función fuente en la que sólo se tiene en cuenta la función definida por el usuario que ocupa la posición más alta. Si la función que ocupa la posición más alta definida por el usuario es segura, las funciones anidadas definidas por el usuario se consideran seguras. El gestor de bases de datos no valida si esas funciones anidadas definidas por el usuario son seguras. Si esas funciones anidadas pueden acceder a datos confidenciales, el usuario con autorización SECADM tiene que garantizar que esas funciones pueden acceder a esos datos y que se ha establecido un procedimiento de auditoría de control de cambios para todos los cambios en esas funciones.

Ejemplos

  • Ejemplo 1:  Algún tiempo después de la creación de la función escalar externa CENTRE de Pellow, otro usuario desea crear una función basada en ella, excepto que esta función está pensada para aceptar solamente argumentos enteros.
       CREATE FUNCTION MYCENTRE (INTEGER, INTEGER)
         RETURNS FLOAT
         SOURCE PELLOW.CENTRE (INTEGER, FLOAT)
  • Ejemplo 2:  Se ha creado un tipo diferenciado, HATSIZE, basándose en el tipo de datos INTEGER incorporado. Sería útil tener una función AVG para calcular el tamaño medio (hatsize) de los distintos departamentos. Esto se lleva a cabo fácilmente de la manera siguiente:
       CREATE FUNCTION AVG (HATSIZE) RETURNS HATSIZE
         SOURCE SYSIBM.AVG (INTEGER)
    La creación del tipo diferenciado ha generado la función de conversión necesaria, permitiendo la conversión de HATSIZE en INTEGER para el argumento y de INTEGER a HATSIZE para el resultado de la función.
  • Ejemplo 3:  En un sistema federado, un usuario desea invocar una UDF Oracle que devuelva estadísticas de tabla en forma de valores con comas flotantes de precisión doble. El servidor federado sólo puede reconocer esta función si existe una correlación entre la función y una función complementaria situada en una base de datos federada. Pero esta función complementaria no existe. El usuario decide suministrar una función complementaria en forma de plantilla de función y asignar esta plantilla a un esquema llamado NOVA. El usuario utiliza el código siguiente para registrar la plantilla en el servidor federado.
       CREATE FUNCTION NOVA.STATS (DOUBLE, DOUBLE)
         RETURNS DOUBLE
         AS TEMPLATE DETERMINISTIC NO EXTERNAL ACTION
  • Ejemplo 4:  En un sistema federado, un usuario desea invocar una UDF de Oracle que devuelve los importes en dólares que los empleados de una organización determinada ganan en forma de bonos. El servidor federado sólo puede reconocer esta función si existe una correlación entre la función y una función complementaria situada en una base de datos federada. No existe esta función complementaria; por lo tanto, el usuario crea una en forma de plantilla de función. El usuario usa el código siguiente para registrar esta plantilla en el servidor federado.
       CREATE FUNCTION BONUS ()
         RETURNS DECIMAL (8,2)
         AS TEMPLATE DETERMINISTIC NO EXTERNAL ACTION