Instrucción CREATE FUNCTION (función escalar SQL en línea)
La sentencia CREATE FUNCTION (escalar de SQL en línea) define una función escalar de SQL en el servidor actual y especifica la sentencia RETURN de Lenguaje de procedimientos SQL para el cuerpo de la función. La función devuelve un valor único cada vez que se invoca.
No se crea un paquete para una función escalar SQL integrada. 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. 
Invocación para CREATE FUNCTION (escala SQL en línea)
Esta sentencia puede incorporarse en un programa de aplicación o emitirse de forma interactiva. Es una instrucción ejecutable que puede prepararse dinámicamente solo si el comportamiento DYNAMICRULES RUN está en vigor. Para obtener más información, consulte ID de autorización y SQL dinámico.
Autorización para CREATE FUNCTION (scalar SQL en línea)
El conjunto de privilegios definido a continuación debe incluir al menos uno de los siguientes:
- El privilegio CREATEIN en el esquema
- Autorización SYSADM o SYSCTRL
- DBADM del sistema
Autoridad de instalación SYSOPR (cuando el SQLID actual del proceso está configurado como SYSINSTL)
El ID de autorización que se corresponde con el nombre del esquema tiene implícito el privilegio CREATEIN sobre el esquema.
Si el ID de autorización que se utiliza para crear la función tiene la autoridad de instalación SYSADM o la autoridad de instalación SYSOPR y si el SQLID actual está configurado como SYSINSTL, la función se identifica como función definida por el sistema.
Si se hace referencia a un tipo definido por el usuario (como el tipo de datos de un parámetro), el conjunto de privilegios también debe incluir al menos uno de los siguientes:
- Propiedad del tipo definido por el usuario
- El privilegio USAGE en el tipo definido por el usuario
- Autorización SYSADM
- Autorización SECADM
- Privilegio CREATE_SECURE_OBJECT
Conjunto de privilegios:
Si la sentencia está incrustada en un programa de aplicación, el conjunto de privilegios son los privilegios que tiene el propietario del plan o paquete. Si el propietario es un rol, la coincidencia de esquema implícita no se aplica y este rol debe incluir una de las condiciones enumeradas anteriormente.
Si la declaración se prepara dinámicamente y no se ejecuta en un contexto de confianza para el que se especifica la cláusula ROLE AS OBJECT OWNER, el conjunto de privilegios es el conjunto de privilegios que posee el ID de autorización SQL del proceso. Si el nombre del esquema no es el mismo que el ID de autorización SQL del proceso, debe cumplirse una de las siguientes condiciones:
- El conjunto de privilegios incluye la autoridad SYSADM o SYSCTRL.
- El ID de autorización SQL del proceso tiene el privilegio CREATEIN en el esquema.
Sintaxis para CREATE FUNCTION (escala SQL en línea)
declaración de parámetros:
tipo de datos:
de tipo incorporado:
definición de función:
- 1 La cláusula RETURNS, la instrucción RETURN y las cláusulas de la lista de opciones se pueden especificar en cualquier orden. Sin embargo, la misma cláusula no puede especificarse más de una vez.
lista de opciones:
- 1 Esta cláusula y las demás cláusulas de la lista de opciones pueden especificarse en cualquier orden. Sin embargo, la misma cláusula no puede especificarse más de una vez.
Cuerpo de la rutina SQL:
Descripción para CREATE FUNCTION (scalar SQL en línea)
- nombre-función
- Nombra la función definida por el usuario. El nombre está implícita o explícitamente calificado por un nombre de esquema. Para obtener más información, consulte
Elegir los nombres de esquema y función
yDeterminar la singularidad de las funciones en un esquema
en la declaración CREATE FUNCTION (resumen ). - (declaración de parámetros,...)
Especifica el número de parámetros de entrada de la función y el nombre y tipo de datos de cada parámetro. Cada declaración de parámetro especifica un parámetro de entrada para la función. Una función puede tener cero o más parámetros de entrada. Debe haber una entrada en la lista para cada parámetro que la función espera recibir. Todos los parámetros de una función son parámetros de entrada y pueden ser nulos. 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.
- nombre-parámetro
- Especifica el nombre del parámetro de entrada. El nombre es un identificador SQL, y cada nombre de la lista de parámetros no debe ser igual a ningún otro nombre.
- tipo-datos
- Especifica el tipo de datos del parámetro de entrada. El tipo de datos puede ser un tipo de datos integrado o un tipo distinto.
- tipo integrado
El tipo de datos del parámetro de entrada es un tipo de datos integrado. 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.
Para los parámetros con un tipo de datos de carácter o gráfico, la cláusula CCSID de PARÁMETRO o la cláusula CCSID indica el esquema de codificación del parámetro. Si no especifica ninguna de estas cláusulas, el esquema de codificación es el valor del campo DEF ENCODING SCHEME en el panel de instalación DSNTIPF.
- nombre-de-tipo-distinto
- El tipo de datos del parámetro de entrada es un tipo distinto. Cualquier atributo de longitud, precisión, escala, subtipo o esquema de codificación para el parámetro son los del tipo de origen del tipo distinto. El tipo distinto no debe basarse en un tipo de datos LOB.
Si especifica el nombre del tipo distinto sin un nombre de esquema, Db2 resuelve el tipo distinto buscando los esquemas en la ruta de SQL.
El esquema de codificación especificado implícita o explícitamente de todos los parámetros con un tipo de datos de cadena de caracteres o gráficos debe ser el mismo: o bien todo ASCII, todo EBCDIC o todo UNICODE.
Aunque los parámetros con un tipo de datos de carácter tienen un subtipo especificado implícita o explícitamente (BIT, SBCS o MIXED), el programa de funciones puede recibir datos de carácter de cualquier subtipo. Por lo tanto, la conversión de los datos de entrada al subtipo del parámetro podría ocurrir cuando se invoque la función. Se produce un error si se utilizan datos mixtos que contienen caracteres DBCS como valor de un parámetro de entrada declarado con un subtipo SBCS.
Los parámetros con un tipo de datos datetime o un tipo distinto se pasan a la función como un tipo de datos diferente:
- Un parámetro de tipo fecha-hora se pasa como un tipo de datos de carácter, y los datos se pasan en formato ISO.
El esquema de codificación para un parámetro de tipo fecha y hora es el mismo que el esquema de codificación especificado implícita o explícitamente de cualquier parámetro de carácter o cadena gráfica. Si no se pasan parámetros de caracteres o cadenas gráficas, el esquema de codificación es el valor del campo DEF ENCODING SCHEME en el panel de instalación DSNTIPF.
- Un parámetro de tipo diferenciado se pasa como tipo fuente del tipo diferenciado.
- RETURNS
- Identifica el resultado de la función.
- data-type2
- Especifica el tipo de datos de la salida. La salida es anulable.
Las mismas consideraciones que se aplican al tipo de datos del parámetro de entrada, como se describe en «tipo de datos » en tipo de datos, se aplican al tipo de datos de la salida de la función.
- LANGUAGE SQL
- Especifica que la función está escrita exclusivamente en SQL.
- SPECIFIC nombre-específico
- Especifica un nombre único para la función. El nombre está calificado implícita o explícitamente con un nombre de esquema. El nombre, incluido el nombre del esquema, no debe identificar el nombre específico de otra función que exista en el servidor actual.
El formato no calificado de un nombre-específico es un identificador SQL. El formulario válido es un identificador SQL (el nombre del esquema) seguido de un punto y un identificador SQL.
Si no especifica un nombre de esquema, será el mismo que el nombre de esquema explícito o implícito del nombre de la función (nombre-función ). Si 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.
Si no especifica la cláusula SPECIFIC, el nombre específico predeterminado es el nombre de la función. Sin embargo, si el nombre de la función no proporciona un nombre específico único o si el nombre de la función es un solo asterisco, Db2 genera un nombre específico en la forma de:
dondeSQLxxxxxxxxxxxx'xxxxxxxxxxxx'es una cadena de 12 caracteres que hacen que el nombre sea único.El nombre específico se almacena en la columna SPECIFIC de la tabla de catálogo SYSROUTINES. El nombre específico puede utilizarse para identificar de forma única la función en varias sentencias SQL (como ALTER FUNCTION, COMMENT, DROP, GRANT y REVOKE) y debe utilizarse en los comandos de l Db2 a (START FUNCTION, STOP FUNCTION y DISPLAY FUNCTION). Sin embargo, la función no puede invocarse por su nombre específico.
- PARAMETER CCSID
- Indica si el esquema de codificación para los parámetros de cadena de caracteres y gráficos es ASCII, EBCDIC o UNICODE. El esquema de codificación predeterminado es el valor especificado en las cláusulas CCSID de la lista de parámetros o en la cláusula RETURNS, o en el campo DEF ENCODING SCHEME del panel de instalación DSNTIPF.
Esta cláusula proporciona una forma práctica de especificar el esquema de codificación para los parámetros de cadena de caracteres y gráficos. Si se especifican cláusulas CCSID individuales para parámetros individuales además de esta cláusula CCSID PARÁMETRO, el valor especificado en todas las cláusulas CCSID debe ser el mismo valor que se especifica en esta cláusula.
Esta cláusula también especifica el esquema de codificación que se utilizará para los parámetros de la rutina generados por el sistema, como los tokens de mensajes y DBINFO.
- NOT DETERMINISTIC o DETERMINISTIC
- Especifica si la función devuelve los mismos resultados cada vez que se invoca con los mismos argumentos de entrada.
- NOT DETERMINISTIC
- La función podría no devolver el mismo resultado cada vez que se invoque con los mismos argumentos de entrada. La función depende de algunos valores de estado que afectan a los resultados. Db2 utiliza esta información para desactivar la combinación de vistas y expresiones de tabla al procesar instrucciones de modificación de datos SELECT y SQL que hacen referencia a esta función. Un ejemplo de una función que no es determinante es la que genera números aleatorios.
NO DETERMINISTA debe especificarse explícita o implícitamente si la función accede a un registro especial o invoca otra función que no es determinista. La opción predeterminada es NO DETERMINISTA.
- DETERMINISTIC
- La función siempre devuelve el mismo resultado cada vez que se invoca la función con los mismos argumentos de entrada. Un ejemplo de función determinista es una función que calcula la raíz cuadrada de la entrada. Db2 utiliza esta información para permitir la fusión de vistas y expresiones de tabla para instrucciones de modificación de datos SELECT y SQL que hacen referencia a esta función. DETERMINISTIC no es el valor predeterminado. Si procede, especifique DETERMINISTIC para evitar que se elijan rutas de acceso no óptimas para las sentencias SQL que hacen referencia a esta función.
Db2 no verifica que el programa de funciones sea coherente con la especificación de DETERMINISTA o NO DETERMINISTA.
- EXTERNAL ACTION o NO EXTERNAL ACTION
- Especifica si la función realiza una acción que cambia el estado de un objeto que Db2 no gestiona. Un ejemplo de una acción externa es enviar un mensaje o grabar un registro en un archivo.
- EXTERNAL ACTION
- La función puede realizar una acción que cambie el estado de un objeto que Db2 no gestiona.
Algunas sentencias SQL que invocan funciones con acciones externas pueden dar resultados incorrectos si las tareas paralelas ejecutan la función. 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. Especifique la cláusula DISALLOW PARALLEL en el caso de las funciones que no funcionen bien con paralelismo.
Si especifica ACCIÓN EXTERNA, entonces Db2:
- Materializa las vistas y expresiones de tabla en instrucciones SELECT y SQL de modificación de datos que hacen referencia a la función. Esta materialización puede afectar negativamente a las rutas de acceso elegidas para las sentencias SQL que hacen referencia a esta función. No especifique ACCIÓN EXTERNA si la función no tiene una acción externa.
- No mueve la función de un bloque de control de tareas (TCB) a otro entre operaciones FETCH.
- No permite que otra función o procedimiento almacenado utilice el TCB hasta que se cierre el cursor. Esto también es aplicable a los cursores declarados CON RETENCIÓN.
Los únicos cambios en los recursos realizados fuera de Db2 que están bajo el control de las operaciones de confirmación y reversión son aquellos cambios realizados bajo el control de RRS.
EXTERNAL ACTION debe especificarse implícita o explícitamente si el cuerpo de la rutina SQL invoca una función que está definida con EXTERNAL ACTION. La ACCIÓN EXTERNA es la predeterminada.
- NO EXTERNAL ACTION
- La función no realiza ninguna acción que cambie el estado de un objeto que Db2 no gestiona. Db2 utiliza esta información para permitir la fusión de vistas y expresiones de tabla para instrucciones de modificación de datos SELECT y SQL que hacen referencia a esta función. Si procede, especifique NO EXTERNAL ACTION para evitar que se elijan rutas de acceso no óptimas para las sentencias SQL que hacen referencia a esta función.
Aunque el alcance de las variables globales está fuera del alcance de la rutina, las variables globales se pueden establecer en el cuerpo de la rutina cuando se especifica NO EXTERNAL ACTION.
Db2 no verifica que el programa de funciones sea coherente con la especificación de ACCIÓN EXTERNA o SIN ACCIÓN EXTERNA.
- LEE DATOS SQL o CONTAINS SQL
- Especifica la clasificación de las sentencias SQL y las rutinas anidadas que esta rutina puede ejecutar o invocar. El administrador de la base de datos verifica que las sentencias SQL emitidas por la función, y todas las rutinas invocadas localmente por la rutina, sean coherentes con esta especificación; la verificación no se realiza cuando se invocan rutinas remotas anidadas. Para la clasificación de cada instrucción, consulte la clasificación de acceso a datos de instrucciones SQL para rutinas.
- LEE DATOS SQL
- Especifica que la función puede ejecutar sentencias con una clasificación de acceso a datos de READS SQL DATA, CONTAINS SQL o NO SQL. La función no puede ejecutar instrucciones SQL que modifiquen datos.
LEER DATOS SQL es la opción predeterminada.
- CONTAINS SQL
- Especifica que la función solo puede ejecutar sentencias SQL con una clasificación de acceso a datos de CONTAINS SQL o NO SQL. La función no puede ejecutar instrucciones SQL que lean o modifiquen datos.
- ENVÍO ESTÁTICO
- En el momento de la resolución de la función, Db2 elige una función basada en los tipos estáticos (o declarados) de los parámetros de la función. El ENVÍO ESTÁTICO es el predeterminado.
- LLAMADA A ENTRADA NULA
- Especifica que la función debe invocarse si alguno o todos los valores de los argumentos son nulos. Especificar CALLED ON NULL INPUT significa que el cuerpo de la función debe estar codificado para comprobar los valores nulos de los argumentos.
CALLED ON NULL INPUT es el valor predeterminado.
- NOT SECURED o SECURED
- Especifica si la función se considera segura para el control de acceso de filas y el control de acceso de columnas. La opción SEGURO o NO SEGURO se aplica a todas las versiones futuras de la función.
- NOT SECURED
- Especifica que la función no se considera segura para el control de acceso de filas y el control de acceso de columnas.
NOT SECURED es el valor predeterminado.
Cuando se invoca la función, los argumentos de la función no deben hacer referencia a una columna para la que esté habilitada una máscara de columna cuando la tabla esté utilizando un control de acceso a columnas activo.
- SECURED
- Especifica que la función se considera segura para el control de acceso de filas y el control de acceso de columnas.
La función debe ser segura cuando se hace referencia a ella en un permiso de fila o una máscara de columna.
- SQL-cuerpo-de-rutina
Especifica una única sentencia RETURN. Para más información, consulte la declaración RETURN.
Si la sentencia RETURN incluye un fullselect escalar, Db2 intenta definir una función compilada. Para obtener más información, consulte la sentencia CREATE FUNCTION (función escalar SQL compilada). 
Para determinar qué tipo de función escalar SQL se crea, consulte la columna INLINE de la tabla del catálogo SYSIBM.SYSROUTINES.

WRAPPED texto-declarativo-ofuscado
FL 500Especifica la definición codificada de la función. Una declaración CREATE FUNCTION puede codificarse utilizando la función escalar WRAP.WRAPPED no debe especificarse en una sentencia CREATE estática.

Notas para CREATE FUNCTION (scalar SQL en línea)
- Consideraciones para todos los tipos de funciones definidas por el usuario:
- Para las consideraciones que se aplican a todos los tipos de funciones definidas por el usuario, consulte la declaración CREAR FUNCIÓN (resumen ).
Tipos de funciones escalares SQL:
Si la sintaxis de la sentencia CREATE FUNCTION se ajusta a los diagramas de sintaxis y descripciones para CREATE FUNCTION (inlined SQL scalar), Db2 define una función inlined, y no se crea un paquete. Cuando se invoca una función escalar SQL en línea, la expresión de la sentencia RETURN de la función se copia (en línea) en la propia consulta; la función no se invoca. Los atributos de una función escalar SQL en línea se describen en la instrucción CREATE FUNCTION (función escalar SQL en línea).De lo contrario, Db2 intenta definir una función compilada con un paquete asociado. Por ejemplo, si la sentencia RETURN contiene un fullselect escalar, Db2 intenta definir una función compilada. Los atributos de una función escalar SQL compilada se describen en la instrucción CREATE FUNCTION (función escalar SQL compilada ).
Para determinar qué tipo de función escalar SQL se crea, consulte la columna INLINE de la tabla de catálogo de SYSIBM.SYSROUTINES. En la columna INLINE, un valor de Y indica que la función es una función en línea, y un valor de N indica que la función es una función compilada.

Consideraciones para funciones definidas con MODIFIES SQL DATA:
Si se especifica una función en una subselección, y la función se define como MODIFIES SQL DATAel número de veces que se invoque la función variará en función del plan de acceso utilizado.
- Función de autorreferencia:
- El cuerpo de una función SQL (es decir, la expresión o NULL en la sentencia RETURN en el cuerpo de la sentencia CREATE FUNCTION) no puede contener una invocación recursiva de sí misma o a otra función que la invoque, porque tal función no existiría para ser referenciada.
- Objetos dependientes:
- Una rutina SQL depende de los objetos a los que se hace referencia en el cuerpo de la rutina.
Declaraciones ofuscadas:
Una sentencia CREATE FUNCTION puede ejecutarse de forma ofuscada. En una declaración ofuscada, solo se pueden leer el nombre de la función, los parámetros y la palabra clave WRAPPED. El resto de la sentencia está codificado de tal modo que no se puede leer pero se puede decodificar mediante un servidor de base de datos que dé soporte a sentencias enmascaradas. La función escalar WRAP produce sentencias ofuscadas. Cualquier opción de depuración que se especifique cuando la función se crea a partir de una sentencia ofuscada se ignora.
- Resolución de nombres de objetos:
- Db2 resuelve nombres de objetos dentro del cuerpo de la función de acuerdo con las reglas de resolución de nombres de objetos no cualificados y el tipo de objeto. La resolución de nombres se produce cuando se crea la función.
- Referencia de fecha y hora de registros especiales:
- Si una función SQL contiene varias referencias a cualquiera de los registros especiales de fecha u hora, todas las referencias devuelven el mismo valor. Además, este valor es el mismo que devuelve el valor de recuperación del registro especial en la sentencia que invocó la función.
- Sintaxis alternativa y sinónimos:
- Para proporcionar compatibilidad con versiones anteriores de Db2 u otros productos de la familia Db2 , Db2 admite la siguiente sintaxis alternativa:
- VARIANT como sinónimo de NO DETERMINISTA
- NO VARIANTE como sinónimo de DETERMINISTA
- LLAMADA NULA como sinónimo de LLAMADA NULA EN ENTRADA
- Se puede especificar ZONA HORARIA como alternativa a ZONA HORARIA.
Para una función escalar SQL en línea, la cláusula RETURNS y las cláusulas de la lista de opciones se pueden especificar en cualquier orden.
Ejemplos para CREATE FUNCTION (scalar SQL en línea)
CREATE FUNCTION TAN (X DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN SIN(X)/COS(X);