Instrucción CREATE FUNCTION (función escalar externa)
La sentencia CREATE FUNCTION registra una función escalar externa definida por el usuario con un servidor de bases de datos. Una función escalar devuelve un único valor cada vez que se invoca.
Invocación para CREATE FUNCTION (escalar externo)
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 CREAR FUNCIÓN (escalar externo)
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.
Se requieren privilegios adicionales si la función utiliza una tabla como parámetro, hace referencia a un tipo distinto o se va a ejecutar en un entorno WLM (gestor de carga de trabajo). Estos privilegios son:
- El privilegio SELECT en cualquier tabla que sea un parámetro de entrada de la función.
- El privilegio USAGE en cada tipo distinto al que hace referencia la función.
- Autoridad para crear programas en el entorno WLM especificado. Esta autorización se obtiene de un producto de seguridad externo, como RACF®. Para obtener más información, consulte Gestión de autorizaciones para la creación de procedimientos almacenados en entornos WLM.
Se requiere al menos uno de los siguientes privilegios adicionales si se especifica la opción SECURED:
- Autorización SECADM
- Privilegio CREATE_SECURE_OBJECT
Cuando LANGUAGE es JAVA y se especifica un nombre de jar en la cláusula EXTERNAL NAME, el conjunto de privilegios debe incluir USAGE en el archivo JAR.
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 (escalar externo)
- 1 Esta cláusula y las cláusulas que siguen en la lista de opciones se pueden especificar en cualquier orden.
- 2 AS LOCATOR solo se puede especificar para un tipo de datos LOB o un tipo distinto basado en un tipo de datos LOB.
declaración de parámetros:
- 1 AS LOCATOR solo se puede especificar para un tipo de datos LOB o un tipo distinto basado en un tipo de datos LOB.
tipo de datos:
tipo integrado:
lista de opciones : (Las cláusulas de la lista de opciones se pueden especificar en cualquier orden)
- 1 La misma cláusula no debe especificarse más de una vez.
- 2 Si NO DETERMINISTIC, EXTERNAL ACTION, SCRATCHPAD o FINAL CALL están especificados, DISALLOW PARALLEL es el valor predeterminado.
Descripción de CREATE FUNCTION (escalar externo)
- 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,...)
- Identifica el número de parámetros de entrada de la función y especifica el tipo de datos de cada parámetro. Todos los parámetros de una función son parámetros de entrada y pueden ser nulos. Debe haber una entrada en la lista para cada parámetro que la función espera recibir. Aunque no es obligatorio, puede asignar un nombre a cada parámetro.Una función no puede tener parámetros. En este caso, debe codificar un conjunto vacío de paréntesis, por ejemplo:
CREATE FUNCTION WOOFER()- 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 incorporado 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.
Si especifica el nombre del tipo distinto sin un nombre de esquema, Db2 resuelve el nombre del esquema 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.
- AS LOCATOR
- Especifica que se pasa un localizador para el valor del parámetro a la función en lugar del valor real. Especifique AS LOCATOR solo para parámetros con un tipo de datos LOB o un tipo distinto basado en un tipo de datos LOB. El hecho de pasar localizadores en lugar de valores puede hacer que se pasen menos bytes a la función, especialmente cuando el valor del parámetro es muy grande.
La cláusula AS LOCATOR no tiene ningún efecto para determinar si los tipos de datos se pueden promocionar, ni afecta a la signatura de función, que se utiliza en la resolución de función.
- TABLA ASÍ nombre-tabla o nombre-vista COMO LOCALIZADOR
- Especifica que el parámetro es una tabla de transición. Sin embargo, cuando se invoca la función, los valores reales de la tabla de transición no se pasan a la función. En su lugar, se pasa un único valor. Este valor único es un localizador de la tabla, que la función utiliza para acceder a las columnas de la tabla de transición. Una función con un parámetro de tabla solo puede invocarse desde la acción desencadenada de un disparador.
El uso de TABLE LIKE proporciona una definición implícita de la tabla de transición. Especifica que la tabla de transición tiene el mismo número de columnas que la tabla o vista identificada. Si se especifica una tabla, la tabla de transición incluye columnas que se definen como ocultas implícitamente en la tabla. Las columnas tienen el mismo tipo de datos, longitud, precisión, escala, subtipo y esquema de codificación que la tabla o vista identificada, tal y como se describen en las tablas de catálogo SYSCOLUMNS y SYSTABLESPACE. El número de columnas y los atributos de dichas columnas se determinan en el momento en que se procesa la instrucción CREATE FUNCTION. Cualquier cambio posterior en el número de columnas de la tabla o en los atributos de esas columnas no afecta a los parámetros de la función.
table-name o view-name deben identificar una tabla o vista que exista en el servidor actual. Una vista no puede tener columnas de longitud 0. El nombre no debe identificar una mesa temporal declarada. La tabla identificada puede contener columnas XML; sin embargo, la función no puede hacer referencia a esas columnas XML. El nombre no tiene que ser el mismo que el de la tabla asociada a la tabla de transición para el desencadenante. Un nombre de tabla o vista no cualificado se cualifica implícitamente de acuerdo con las siguientes reglas:
- Si la instrucción CREATE FUNCTION está incrustada en un programa, el calificador implícito es el ID de autorización en la opción de enlace QUALIFIER cuando se creó o se actualizó por última vez el plan o el paquete. Si no se utilizó CALIFICADOR, el calificador implícito es el propietario del plan o paquete.
- Si la instrucción CREATE FUNCTION se prepara dinámicamente, el calificador implícito es el ID de autorización SQL en el registro especial CURRENT SCHEMA.
Cuando se invoque la función, las columnas correspondientes de la tabla de transición identificada por el localizador de tabla y la tabla o vista identificada en la cláusula TABLE LIKE deben tener la misma definición. El tipo de datos, la longitud, la precisión, la escala y el esquema de codificación de estas columnas deben coincidir exactamente. Se utiliza la descripción de la tabla o vista en el momento en que se ejecutó la instrucción CREATE FUNCTION.
Además, una columna de carácter FOR BIT DATA de la tabla de transición no puede pasarse como entrada para un parámetro de tabla para el que la columna correspondiente de la tabla especificada en la definición no esté definida como carácter FOR BIT DATA. (La definición aparece con la instrucción CREATE FUNCTION) Del mismo modo, una columna de caracteres de la tabla de transición que no sea FOR BIT DATA no puede pasarse como entrada para un parámetro de tabla para el que la columna correspondiente de la tabla especificada en la definición esté definida como carácter FOR BIT DATA.
Para obtener más información sobre el uso de localizadores de tablas, consulte Acceso a tablas de transición en una función definida por el usuario o un procedimiento almacenado.
- RETURNS
- Especifica el tipo de datos para el resultado de la función. Considere esta cláusula junto con la cláusula opcional CAST FROM.
- data-type2
- Especifica el tipo de datos de la salida. El parámetro de salida es anulable.
Las mismas consideraciones que se aplican al tipo de datos y a la anulabilidad del parámetro de entrada, tal y como se describe en el tipo de datos, se aplican al tipo de datos del resultado de la función.
- AS LOCATOR
- Especifica que la función devuelve un localizador al valor en lugar del valor real. Puede especificar AS LOCATOR solo si el resultado de la función tiene un tipo de datos LOB o un tipo distinto basado en un tipo de datos LOB.
- data-type3 CAST FROM data-type4
- Especifica el tipo de datos de la salida de la función ( data-type4 ) y el tipo de datos en el que se devuelve esa salida a la sentencia de invocación ( data-type3 ). Los dos tipos de datos pueden ser diferentes. Por ejemplo, para la siguiente definición, la función devuelve un valor DOUBLE, que Db2 convierte en un valor DECIMAL y luego pasa a la instrucción que invocó la función:
El valor de data-type4 puede ser cualquier tipo de datos incorporado y debe ser moldeable a data-type3. El valor de data-type3 puede ser cualquier tipo de datos incorporado. (Para obtener información sobre la conversión de tipos de datos, consulte Conversión entre tipos de datos ) El esquema de codificación de los parámetros, si son tipos de datos de cadena, debe ser el mismo.CREATE FUNCTION SQRT(DECIMAL(15,0)) RETURNS DECIMAL(15,0) CAST FROM DOUBLE ...Si se especifica la cláusula PARAMETER VARCHAR, data-type3 y data-type4 debería especificarse como VARCHAR.
- AS LOCATOR
- Especifica que la función devuelve un localizador al valor en lugar del valor. Puede especificar AS LOCATOR solo si data-type4 es un tipo de datos LOB o un tipo distinto basado en un tipo de datos LOB.
- ESPECÍFICO 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 se puede utilizar para identificar de forma exclusiva la función en varias instrucciones SQL (como ALTER FUNCTION, COMMENT, DROP, GRANT y REVOKE) y debe utilizarse en los comandos de l Db2 encia (START FUNCTION, STOP FUNCTION y DISPLAY FUNCTION). Sin embargo, la función no puede invocarse por su nombre específico.
- PARÁMETRO CCSID o VARCHAR
- Especifica el esquema de codificación para los pará metros de cadena de caracteres y gráficos, y en el caso de LANGUAGE C, especifica la representación de los parámetros de cadena de longitud variable.
- 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 todos los parámetros de cadena. 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 que el especificado 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.
- VARCHAR
- Especifica la representación de los valores de parámetros de cadena de caracteres de longitud variable, incluyendo, si procede, la salida de la función, para funciones que especifican LANGUAGE C.
Esta opción solo puede especificarse si también se especifica IDIOMA C.
- NULTERM
- Especifica que los parámetros de cadena de caracteres de longitud variable se representan en forma de cadena terminada en NUL.
- ESTRUCTURA
- Especifica que los parámetros de cadena de caracteres de longitud variable se representan en forma de estructura VARCHAR.
Al utilizar la cláusula PARAMETER VARCHAR, no hay forma de especificar la forma VARCHAR de un parámetro individual como ocurre con la cláusula PARAMETER CCSID. La cláusula PARAMETER VARCHAR solo se aplica a los parámetros de la lista de parámetros de una función y en la cláusula RETURNS. No se aplica a los parámetros de la rutina generados por el sistema, como los tokens de mensajes y DBINFO.
En un entorno de intercambio de datos, no debe especificar la cláusula PARAMETER VARCHAR hasta que todos los miembros del grupo de intercambio de datos admitan la cláusula. Si algunos miembros del grupo apoyan esta cláusula y otros no, y se especifica PARAMETER VARCHAR en una rutina externa, la rutina encontrará diferentes formas de parámetros dependiendo de qué miembro del grupo invoque la rutina.
- EXTERNAL
- Especifica que la instrucción CREATE FUNCTION se está utilizando para definir una nueva función que se basa en código escrito en un lenguaje de programación externo.
Db2 carga el módulo de carga cuando se invoca la función. El módulo de carga se crea cuando el programa que contiene el cuerpo de la función se compila y se edita el enlace. El módulo de carga no necesita existir cuando se ejecuta la instrucción CREATE FUNCTION. Sin embargo, debe existir y ser accesible por el servidor actual cuando se invoque la función.
Puede especificar la cláusula EXTERNAL de una de las siguientes maneras:EXTERNAL EXTERNAL NAME PKJVSP1 EXTERNAL NAME 'PKJVSP1'Si especifica un nombre de programa externo, debe utilizar la palabra clave NAME. Por ejemplo, esta sintaxis no es válida:EXTERNAL PKJVSP1- NOMBRE nombre-programa-externo o identificador
- Identifica el código escrito por el usuario que implementa la función definida por el usuario.
Si LANGUAGE es JAVA, se debe especificar external-program-name y ponerlo entre comillas simples, sin espacios extraños dentro de las comillas simples. Debe especificar un nombre de rutina externa de Java válido. Si se especifican varios nombres de programas externos, la longitud total de todos ellos no debe ser superior a 1305 bytes y deben estar separados por un espacio o un salto de línea. No especifique un archivo JAR para una función JAVA para la que también se especifique NO SQL.
Un nombre de rutina de Java externa contiene las siguientes partes:- nombre-jarra
- Identifica el nombre dado al archivo JAR cuando se instaló en la base de datos. El nombre contiene jar-id, que puede calificarse opcionalmente con un esquema. Algunos ejemplos son "myJar" y ""mySchema.myJar." El jar-id no cualificado se cualifica implícitamente con un nombre de esquema de acuerdo con las siguientes reglas:
- Si el extracto está integrado en un programa, el nombre del esquema es el ID de autorización en la opción de enlace QUALIFIER cuando se creó el paquete o plan o se realizó la última actualización. Si no se especificó el CALIFICADOR, el nombre del esquema es el propietario del paquete o plan.
- Si el estado se prepara dinámicamente, el nombre del esquema es el ID de autorización SQL en el registro especial CURRENT SCHEMA.
Si se especifica el nombre del frasco, este debe existir cuando se procese la instrucción CREATE FUNCTION.
Si no se especifica jar-name, la función se carga directamente desde el archivo de clase en lugar de cargarse desde un archivo JAR. Db2 busca en los directorios del CLASSPATH asociados con el entorno WLM. Las variables ambientales para las rutinas Java™ se especifican en un conjunto de datos identificado en una tarjeta DD JAVAENV en el JCL utilizado para iniciar el espacio de direcciones para una función gestionada por WLM.
- nombre-método
- Identifica el nombre del método y no debe tener más de 254 bytes. Los ID de paquete, clase y método son específicos de Java y, como tales, no están limitados a 18 bytes. Además, las reglas sobre lo que pueden contener no son necesariamente las mismas que las de un identificador ordinario SQL.
- id-paquete
- Identifica un paquete. La lista concatenada de identificadores de paquetes identifica el paquete del que forma parte el identificador de clase. Si la clase forma parte de un paquete, el nombre del método debe incluir el prefijo completo del paquete, como « "myPacks.UserFuncs » La máquina virtual Java busca las clases en el directorio "/myPacks/UserFuncs/".
- id-clase
- Identifica el identificador de clase del objeto Java.
- identificador del método
- Identifica el identificador de método con la clase Java que se va a invocar.
- método-firma
- Identifica una lista de cero o más tipos de datos Java para la lista de parámetros y no debe tener más de 1024 bytes. Especifique la firma del método si la función definida por el usuario implica algún parámetro de entrada o salida que pueda ser NULL. Cuando se llama a la función que se está creando, Db2 busca un método Java con la firma de método exacta. El número de elementos java-datatype especificados indica cuántos parámetros debe tener el método Java.
Un procedimiento Java no puede tener parámetros. En este caso, codifica un conjunto vacío de paréntesis para la firma del método. Si no se especifica una firma de método Java, Db2 busca un método Java con una firma derivada de los tipos predeterminados de JDBC asociados con los tipos SQL especificados en la lista de parámetros de la instrucción CREATE FUNCTION.
Para otros valores de LANGUAGE, el nombre puede ser una constante de cadena que no tenga más de 8 caracteres. Debe ajustarse a las convenciones de nomenclatura para los módulos de carga. Se pueden utilizar extensores alfabéticos para los idiomas nacionales como primer carácter y como caracteres posteriores en el nombre del módulo de carga.
Si no se especifica la cláusula NAME, 'NAME nombre-función ' es implícita. En este caso, el nombre de la función no debe tener más de 8 caracteres.
- LANGUAGE
- Especifica la convención de idioma de la interfaz en la que está escrito el cuerpo de la función. Todos los programas deben estar diseñados para ejecutarse en el entorno Language Environment® de IBM®.
- ASSEMBLE
- La función está escrita en ensamblador.
- C
- La función está escrita en C o C++.
- COBOL
- La función está escrita en COBOL, incluidas las extensiones del lenguaje orientado a objetos.
- JAVA
- La función definida por el usuario está escrita en Java y se ejecuta en la máquina virtual Java. Cuando se especifica LANGUAGE JAVA, la cláusula EXTERNAL NAME también debe especificarse con un nombre de rutina externa de Java válido y PARAMETER STYLE debe especificarse con JAVA.
No especifique LANGUAGE JAVA cuando SCRATCHPAD, FINAL CALL, DBINFO, PROGRAM TYPE MAIN o RUN OPTIONS estén en efecto.
- PLI
- La función está escrita en PL/I.
- PARAMETER STYLE
- Especifica las convenciones para pasar parámetros a la función y devolver un valor desde ella.
- SQL
- Especifica la convención de paso de parámetros que admite el paso de valores nulos tanto como entrada como para salida. Los parámetros que se transmiten entre la instrucción SQL de invocación y la función incluyen:
- n parámetros para los parámetros de entrada que se especifican para la función
- Un parámetro para el resultado de la función
- n parámetros para las variables indicadoras de los parámetros de entrada
- Un parámetro para la variable indicadora del resultado
- El SQLSTATE que se devolverá a Db2
- El nombre calificado de la función
- El nombre específico de la función
- La cadena de diagnóstico SQL que se devolverá a Db2
- La función también puede pasar de cero a tres parámetros adicionales:
- El bloc de notas, si se especifica BLOC DE NOTAS
- El tipo de llamada, si se especifica LLAMADA FINAL
- La estructura DBINFO, si se especifica DBINFO
- JAVA
- Indica que la función definida por el usuario utiliza una convención para pasar parámetros que se ajusta a las especificaciones de Java y SQLJ. PARÁMETRO ESTILO JAVA solo se puede especificar si IDIOMA se especifica como JAVA. JAVA debe especificarse para PARAMETER STYLE cuando se especifique LANGUAGE JAVA.
- 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 deshabilitar la fusión de vistas y expresiones de tabla al procesar declaraciones de cambio de datos SELECT o SQL que hacen referencia a esta función. Un ejemplo de función no determinista es aquella que genera números aleatorios, o cualquier función que contenga sentencias SQL.
La opción predeterminada es NO DETERMINISTA.
Algunas funciones que no son deterministas pueden recibir resultados incorrectos si la función se ejecuta mediante tareas paralelas. Especifique la cláusula DISALLOW PARALLEL para estas funciones.
- DETERMINISTIC
- La función siempre devuelve el mismo resultado cada vez que se invoca 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 o 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.
- FENCED
- Especifica que la función externa se ejecuta en un espacio de direcciones externo para evitar que la función corrompa el almacenamien Db2 .
CERCADO es el valor predeterminado.
- RETURNS NULL ON NULL INPUT o CALLED ON NULL INPUT
- Especifica si la función se llama si alguno de los argumentos de entrada es nulo en el momento de la ejecución.
- RETURNS NULL ON NULL INPUT
- La función no se llama si alguno de los argumentos de entrada es nulo. El resultado es el valor NULL. DEVOLUCIONES NULO EN ENTRADA es el valor predeterminado.
- CALLED ON NULL INPUT
- La función se llama independientemente de si alguno de los argumentos de entrada es nulo, lo que hace que la función sea responsable de comprobar los valores de los argumentos nulos. La función puede devolver un valor nulo o no nulo.
- MODIFIES SQL DATA, LEE DATOS SQL, CONTAINS SQL, o NO 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.
- MODIFIES SQL DATA
Especifica que la función puede ejecutar cualquier instrucción SQL, excepto las instrucciones que no son compatibles con las funciones. No especifique MODIFIES SQL DATA cuando ALLOW PARALLEL esté en vigor.
Si una función que se define con MODIFIES SQL DATA se invoca en cualquier lugar excepto en la cláusula select de la sentencia SELECT más externa, los resultados son impredecibles porque la función puede invocarse varias veces dependiendo del plan de acceso que se utilice.
Recomendación:
Si una sentencia SELECT invoca una función definida con la opción MODIFIES SQL DATA, asegúrese de que las sentencias anidadas dentro de la función no modifican objetos a los que se hace referencia en cualquier sentencia SQL de un nivel de anidamiento superior. De lo contrario, es probable que se produzcan resultados impredecibles.
- READS SQL DATA
- Especifica que la función puede ejecutar sentencias con una indicació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. El valor predeterminado es LEER DATOS SQL.
- CONTAINS SQL
- Especifica que la función solo puede ejecutar sentencias SQL con una indicación de acceso de CONTAINS SQL o NO SQL. La función no puede ejecutar instrucciones que lean o modifiquen datos.
- NO SQL
- Especifica que la función solo puede ejecutar sentencias SQL con una clasificación de acceso a datos de NO SQL. No especifique NO SQL para una función JAVA que utilice un archivo JAR.
- 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.
Debido a que Db2 utiliza el adjunto RRS para funciones externas, Db2 puede participar en un compromiso de dos fases con cualquier otro administrador de recursos que utilice RRS. Para los administradores de recursos que no utilizan RRS, no hay coordinación de las operaciones de confirmación o reversión en recursos que no son deDb2 .
- EXTERNAL ACTION
- Especifica que la función puede realizar una acción que cambia 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, Db2:
- Materializa las vistas y expresiones de tabla en SELECT o en sentencias 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.
La ACCIÓN EXTERNA es la predeterminada.
- NO EXTERNAL ACTION
- Especifica que 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 SELECT y sentencias de modificación de datos 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.
- SIN RUTA DE PAQUETE o RUTA DE PAQUETE ruta-paquete
- Especifica la ruta del paquete que se utilizará cuando se ejecute la función. Esta es la lista de las posibles recogidas de paquetes a las que está vinculado el DBRM con el que está asociada la función.
- SIN RUTA DE ENVÍO
- Especifica que la lista de recolecciones de paquetes para la función es la misma que la lista de ID de recolección de paquetes para el programa que invoca la función. Si el programa que invoca la función no utiliza un paquete, Db2 resuelve el paquete utilizando el registro especial CURRENT PACKAGE PATH, el registro especial CURRENT PACKAGESET o la opción de enlace PKLIST (en este orden). Para obtener información sobre cómo Db2 utiliza estos tres elementos, consulte Vinculación de un plan de aplicación.
- RUTA DEL PAQUETE ruta-del-paquete
- Especifica una lista de recopilaciones de paquetes, en el mismo formato que el registro especial ESTABLECER RUTA DE PAQUETE ACTUAL.
Si la cláusula COLLID se especifica con PACKAGE PATH, la cláusula COLLID se ignora cuando se invoca la función.
El valor de la ruta del paquete que se proporciona cuando se crea la función se comprueba cuando se invoca la función. Si la ruta del paquete contiene SESSION_USER (o USER), PATH o PACKAGE PATH, se devuelve un error cuando se comprueba el valor de la ruta del paquete.
- SIN SCRATCHPAD o SCRATCHPAD
- Especifica si Db2 debe proporcionar un bloc de notas para la función. Se recomienda encarecidamente que las funciones externas sean reentrantes, y un bloc de notas proporciona un área para que la función guarde información de una invocación a la siguiente.
- NO SCRATCHPAD
- Especifica que no se asigna un bloc de notas y se pasa a la función. NO SCRATCHPAD es la opción predeterminada.
- Longitud de la SCRATCHPAD
- Especifica que cuando se invoca la función por primera vez, Db2 asigna memoria para un bloc de notas. Un bloc de notas tiene las siguientes características:
- longitud debe estar en el rango 1-32767. El valor predeterminado es 100 bytes.
- Db2 inicializa el bloc de notas con todos los ceros binarios (X'00''s ).
- El ámbito de un bloc de notas es la instrucción SQL. Por cada referencia a la función en una instrucción SQL, hay un bloc de notas. Por ejemplo, suponiendo que la función UDFX se definió con la palabra clave SCRATCHPAD, se asignan tres blocs de notas para las tres referencias a UDFX en la siguiente instrucción SQL:
SELECT A, UDFX(A) FROM TABLEB WHERE UDFX(A) > 103 OR UDFX(A) < 19;Si la función se ejecuta en tareas paralelas, se asigna un bloc de notas para cada tarea paralela de cada referencia a la función en la instrucción SQL. Esto puede conducir a resultados impredecibles. Por ejemplo, si una función utiliza el bloc de notas para contar el número de veces que se invoca, el recuento refleja el número de invocaciones realizadas por la tarea paralela y no la instrucción SQL. Especifique la cláusula DISALLOW PARALLEL para las funciones que no funcionarán correctamente con el paralelismo.
- La memoria de trabajo es permanente. Db2 conserva su contenido de una invocación de la función a la siguiente. Cualquier cambio que la función realice en el bloc de notas en una llamada sigue ahí en la siguiente llamada. Db2 inicializa los blocs de notas cuando comienza a ejecutar una instrucción SQL. Db2 no reinicia los scratchpads cuando se empieza a ejecutar una subconsulta correlacionada.
- El bloc de notas puede ser un punto central para los recursos del sistema que la función adquiere. Si la función adquiere recursos del sistema, especifique FINAL CALL para asegurarse de que Db2 llame a la función una vez más para que la función pueda liberar esos recursos del sistema.
Cada vez que se invoca la función, Db2 pasa un argumento adicional a la función que contiene la dirección del bloc de notas.
Si especifica SCRATCHPAD, Db2:
- 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.
No especifique SCRATCHPAD cuando LANGUAGE JAVA esté en vigor.
- NO FINAL CALL o FINAL CALL
- Especifica si se realiza una llamada final a la función. Una llamada final permite que la función libere los recursos del sistema que haya adquirido. Una llamada final es útil cuando la función se ha definido con la palabra clave SCRATCHPAD y la función adquiere recursos del sistema y los ancla en el bloc de notas.
- NO FINAL CALL
- Especifica que no se realiza una llamada final a la función. La función no recibe un argumento adicional que especifique el tipo de llamada. La opción predeterminada es NO LLAMAR AL FINAL.
- FINAL CALL
- Especifica que se realiza una llamada final a la función. Para diferenciar entre llamadas finales y otras llamadas, la función recibe un argumento adicional que especifica el tipo de llamada. Los tipos de llamada son:
- Primera llamada
- Especifica que la primera llamada a la función para esta referencia a la función en esta instrucción SQL. Una primera llamada es una llamada normal: se pasan argumentos SQL y se espera que la función devuelva un resultado.
- Llamada normal
- Especifica que se pasan argumentos SQL y que se espera que la función devuelva un resultado.
- Llamada final
- Especifica que la última llamada a la función para habilitar la función para liberar recursos. Una llamada final no es una llamada normal. Si se produce un error, Db2 intentará tomar la decisión final a menos que la función haya fallado. Se realiza una última llamada en estos momentos:
- Fin de la instrucción : Cuando el cursor se cierra para las instrucciones orientadas al cursor, o cuando se ha completado la ejecución de la instrucción.
- Fin de una tarea paralela : Cuando la función se ejecuta mediante tareas paralelas.
- Fin de la transacción : cuando no se produce el fin normal del procesamiento del extracto. Por ejemplo, la lógica de una aplicación, por alguna razón, omite el cierre del cursor.
Si se produce una operación de confirmación mientras un cursor definido como CON RETENCIÓN está abierto, se realiza una llamada final cuando se cierra el cursor o finaliza la aplicación. Si se produce un commit al final de una tarea paralela, se realiza una llamada final independientemente de si un cursor definido como WITH HOLD está abierto.
Si una operación de confirmación, reversión o cancelación provoca la llamada final, la función no puede emitir ninguna instrucción SQL cuando se invoque.
Algunas funciones que utilizan una llamada final pueden recibir resultados incorrectos si tareas paralelas ejecutan la función. Por ejemplo, si una función envía una nota por cada llamada final a ella, se envía una nota por cada tarea paralela en lugar de una por la función. Especifique la cláusula DISALLOW PARALLEL para funciones que tienen acciones inapropiadas cuando se ejecutan en paralelo.
No especifique FINAL CALL cuando LANGUAGE JAVA esté en vigor.
- PERMITIR o DENEGAR PARALELO
- Para una sola referencia a la función, especifica si se puede utilizar el paralelismo cuando se invoca la función. Aunque el paralelismo puede utilizarse para la mayoría de las funciones escalares, algunas funciones, como las que dependen de una única copia del bloc de notas, no pueden invocarse con tareas paralelas.
Tenga en cuenta estas características al determinar qué cláusula utilizar:
- Si todas las invocaciones de la función son completamente independientes entre sí, especifique ALLOW PARALLEL.
- Si cada invocación de la función actualiza el bloc de notas, proporcionando valores que son de interés para la siguiente invocación, como incrementar un contador, especifique DISALLOW PARALLEL.
- Si el scratchpad se utiliza únicamente para que se realice un número mínimo de veces un costoso procesamiento de inicialización, especifique PERMITIR PARALELO.
- Si la función realiza alguna acción externa que debería aplicarse a una sola partición, especifique DISALLOW PARALLEL.
- Si la función se define con MODIFIES SQL DATA, especifique DISALLOW PARALLEL, no ALLOW PARALLEL.
PERMITIR PARALELO es el valor predeterminado a menos que se especifique NO DETERMINISTA, ACCIÓN EXTERNA, SCRATCHPAD o LLAMADA FINAL, en cuyo caso, NO PERMITIR PARALELO es el valor predeterminado.
- ALLOW PARALLEL
- Especifica que Db2 puede considerar el paralelismo para la función. El paralelismo no se fuerza en la instrucción SQL que invoca la función ni en ninguna instrucción SQL de la función. Se aplican las restricciones existentes sobre el paralelismo.
- DISALLOW PARALLEL
- Especifica que Db2 no considera el paralelismo para la función.
- NO DBINFO o DBINFO
- Especifica si se pasa información de estado adicional a la función cuando se invoca.
- NO DBINFO
- No se transmite información adicional. NO DBINFO es el valor predeterminado.
- DBINFO
- Se pasa un argumento adicional cuando se invoca la función. El argumento es una estructura que contiene información como el ID de autorización de tiempo de ejecución de la aplicación, el nombre del esquema, el nombre de una tabla o columna en la que la función podría estar insertando o actualizando, y la identificación del servidor de base de datos que invocó la función. Para obtener más información sobre el argumento y su estructura, consulte la estructura DBINFO.
No especifique DBINFO cuando LANGUAGE JAVA esté en vigor.
- NO COLLID o COLLID ID de colección
- Identifica la recolección de paquetes que se utilizará cuando se ejecute la función. Este es el paquete de recopilación al que está vinculado el DBRM asociado al programa de funciones.
- NO COLLID
- La recogida de paquetes para la función es la misma que la recogida de paquetes del programa que invoca la función. Si un activador invoca la función, se utiliza la colección del paquete del activador. Si el programa que invoca no utiliza un paquete, Db2 resuelve el paquete utilizando el registro especial CURRENT PACKAGE PATH, el registro especial CURRENT PACKAGESET o la opción de enlace PKLIST (en este orden). Para obtener más información sobre cómo Db2 utiliza estos tres elementos, consulte la información sobre la resolución de paquetes en Anulación de los valores que Db2 utiliza para resolver listas de paquetes.
NO COLLID es el valor predeterminado.
- COLLID collection-id
- El nombre de la recogida de paquetes que se va a utilizar cuando se ejecute la función.
- WLM ENVIRONMENT
- Identifica el entorno de aplicación WLM (gestor de carga de trabajo) en el que se ejecuta la función. El nombre del entorno WLM es un identificador SQL.
Si no especifica WLM ENVIRONMENT, la función se ejecuta en el espacio de direcciones de procedimiento almacenado establecido por WLM que se especifica en el momento de la instalación. Cuando el IDIOMA es JAVA, debe especificar ENTORNO WLM, y el entorno WLM en el que se ejecutará la función debe estar habilitado para Java.
- nombre
- El entorno WLM en el que debe ejecutarse la función. Si otra función definida por el usuario o un procedimiento almacenado llama a la función y esa rutina de llamada se ejecuta en un espacio de direcciones que no está asociado con el entorno WLM, Db2 enruta la solicitud de función a un espacio de direcciones diferente.
- (nombre,*)
- Cuando un programa de aplicación SQL invoca directamente la función, el entorno WLM en el que se ejecuta la función.
Si otra función definida por el usuario o un procedimiento almacenado llama a la función, esta se ejecuta en el mismo entorno que utiliza la rutina de llamada. En este caso, la autorización para ejecutar la función en el entorno WLM no se comprueba porque la autorización de la rutina de llamada es suficiente.
Los usuarios deben tener la autorización adecuada para ejecutar funciones en el entorno WLM especificado.
- ASUTIME
- Especifica la cantidad total de tiempo de procesador, en unidades de servicio de CPU, que puede ejecutar una sola invocación de la función. El valor no está relacionado con la columna ASUTIME de la tabla de especificación de límites de recursos. Esta opción se ignora si se especifica LANGUAGE JAVA.
Cuando se depura una función, establecer un límite puede ser útil si la función queda atrapada en un bucle. Para obtener información sobre las unidades de servicio, consulte z/OS MVS Guía de inicialización y ajuste.
- Sin límites
- No hay límite en las unidades de servicio. NO LIMIT es el valor predeterminado.
- LIMIT entero
- El límite en el número de unidades de servicio de CPU es un número entero positivo en el rango de 1 a 2147483647. Si el procedimiento utiliza más unidades de servicio que el valor especificado, Db2 cancela el procedimiento. Los ciclos de CPU que consumen las tareas paralelas en un procedimiento no contribuyen al LÍMITE DE TIEMPO DE EJECUCIÓN especificado.
- STAYRESIDENT
- Especifica si el módulo de carga de la función debe permanecer en la memoria cuando finalice la función. Esta opción se ignora si se especifica LANGUAGE JAVA.
- NEE
- El módulo de carga se elimina de la memoria una vez finalizada la función. Utilice NO para funciones no reentrantes. NO es el valor predeterminado.
- YES
- El módulo de carga permanece en la memoria después de que finalice la función. Utilice SÍ para funciones reentrantes.
- PROGRAMTYPE
- Especifica si el programa de función se ejecuta como una rutina principal o como una subrutina.
- SUB
- La función se ejecuta como subrutina. Con LANGUAGE JAVA, PROGRAM TYPE SUB es la única opción válida. SUB es el valor predeterminado.
- MAIN
- La función se ejecuta como una rutina principal.
- SEGURIDAD
- Especifica cómo interactúa la función con un producto de seguridad externo, como RACF, para controlar el acceso a recursos no SQL.
- Db2
- La función no requiere un entorno de seguridad externo. Si la función accede a recursos protegidos por un producto de seguridad externo, el acceso se realiza utilizando el ID de autorización asociado al espacio de direcciones de procedimiento almacenado establecido por WLM.
Db2 es el valor predeterminado.
- USUARIO
- Debe establecerse un entorno de seguridad externo para la función. Si la función accede a recursos protegidos por el producto de seguridad externo, el acceso se realiza utilizando el ID de autorización principal del proceso que invocó la función.
- DEFINER
- Debe establecerse un entorno de seguridad externo para la función. Si la función accede a recursos protegidos por el producto de seguridad externo, el acceso se realiza utilizando el ID de autorización del propietario de la función.
- DETENERSE TRAS FALLOS POR DEFECTO DEL SISTEMA, DETENERSE TRAS nn FALLOS, o CONTINUAR TRAS FALLO
- Especifica si la rutina debe ponerse en estado detenido después de un cierto número de fallos.
- DETENERSE DESPUÉS DE FALLOS POR DEFECTO DEL SISTEMA
- Especifica que esta rutina debe colocarse en estado detenido después del número de fallos indicado por el valor del campo MAX ABEND COUNT en el panel de instalación DSNTIPX. Este es el valor predeterminado.
- DETENERSE DESPUÉS DE nn FALLOS
- Especifica que esta rutina debe colocarse en estado detenido después de nn fallos. El valor nn puede ser un entero de 1 a 32767.
- CONTINUAR DESPUÉS DE UN ERROR
- Especifica que esta rutina no debe colocarse en estado detenido después de cualquier fallo.
- OPCIONES DE EJECUCIÓN opciones de tiempo de ejecución
- Especifica las opciones de ejecución de Language Environment que se utilizarán para la función. Debe especificar las opciones de tiempo de ejecución como una cadena de caracteres que no supere los 254 bytes. Si no especifica OPCIONES DE EJECUCIÓN o pasa una cadena vacía, Db2 no pasa ninguna opción de ejecución a Language Environment, y Language Environment utiliza sus valores predeterminados de instalación. Para obtener una descripción de las opciones de ejecución de Language Environment, consulte Language Environment Programming Reference.
No especifique RUN OPTIONS cuando LANGUAGE JAVA esté en vigor.
- REGISTROS ESPECIALES DE HERENCIA o REGISTROS ESPECIALES POR DEFECTO
- Especifica cómo se establecen los registros especiales al entrar en la rutina.
- INHERIT SPECIAL REGISTERS
- Especifica que los valores de los registros especiales se heredan de acuerdo con las reglas enumeradas en la tabla para las características de los registros especiales en una función definida por el usuario en Registros especiales en una función definida por el usuario o un procedimiento almacenado.
- REGISTROS ESPECIALES POR DEFECTO
- Especifica que los registros especiales se inicializan con los valores predeterminados, como lo indican las reglas de la tabla de características de los registros especiales en una función definida por el usuario en Registros especiales en una función definida por el usuario o un procedimiento almacenado.
- STATIC DISPATCH
- 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.
- 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.
- 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 definirse con SECURED cuando se hace referencia a ella en un permiso de fila o una máscara de columna.
Notas para CREAR FUNCIÓN (escalar externo)
- 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 ).
- Consideraciones sobre la representación de cadenas de caracteres:
- La cláusula PARAMETER VARCHAR es específica de las funciones LANGUAGE C debido al uso nativo de cadenas terminadas en NUL en C. La representación de la estructura VARCHAR es útil cuando se sabe que los datos de la cadena de caracteres contienen terminadores NUL incrustados. También es útil cuando no se puede garantizar que los datos de la cadena de caracteres no contengan terminadores NUL incrustados.
PARÁMETRO VARCHAR no se aplica a cadenas de caracteres de longitud fija, VARCHAR PARA DATOS DE BIT, CLOB, DBCLOB o parámetros generados implícitamente. La cláusula no se aplica a VARCHAR FOR BIT DATA porque BIT DATA puede contener caracteres X'00', y su representación de valor comienza con información de longitud. No se aplica a los datos LOB porque una representación de valor LOB comienza con información de longitud.
PARÁMETRO VARCHAR no se aplica a los parámetros opcionales que se proporcionan implícitamente a una función externa. Por ejemplo, una instrucción CREATE FUNCTION para LANGUAGE C también debe especificar PARAMETER STYLE SQL, que devuelve una cadena de caracteres SQLSTATE terminada en NULL; ese SQLSTATE no se representará en forma estructurada VARCHAR. Del mismo modo, ninguno de los parámetros que representan el nombre calificado de la función, el nombre específico de la función o la cadena de diagnóstico SQL que se devuelve al gestor de la base de datos se representará en forma estructurada VARCHAR.
- Ejecución de funciones externas en entornos WLM:
- Puede utilizar la cláusula WLM ENVIRONMENT para identificar el espacio de direcciones en el que se ejecutará una función. La utilización de diferentes entornos de WLM
le permite aislar un grupo de programas de otro. Por ejemplo, puede optar por aislar programas en función de los requisitos de seguridad y colocar todas las aplicaciones de nóminas en un entorno WLM porque esas aplicaciones tratan datos, como los salarios de los empleados.
Para evitar que un usuario defina funciones en entornos WLM sensibles, Db2 invoca al administrador de seguridad externo para determinar si el usuario tiene autorización para emitir sentencias CREATE FUNCTION que hagan referencia al entorno WLM especificado. El siguiente ejemplo muestra el comando RACF que autoriza al usuario DB2USER1 de Db2 a registrar una función en el subsistema Db2 DB2A que se ejecuta en el entorno WLM llamado PAYROLL.
PERMIT DB2A.WLMENV.PAYROLL CLASS(DSNR) ID(DB2USER1) ACCESS(READ)Para obtener más información, consulte Gestión de autorizaciones para la creación de procedimientos almacenados en entornos WLM.
- Consideraciones para acceder a los tokens de mensajes y DBINFO:
- Db2 devuelve parámetros generados por el sistema a partir de una rutina, como tokens de mensajes y DBINFO. Los tokens de mensaje y DBINFO son datos de cadena de caracteres. El CCSID para los parámetros de cadena generados por el sistema se determina a partir del CCSID que está en vigor para los parámetros de cadena que se definen para la rutina. Si la lista de parámetros de la rutina no incluye ningún parámetro de carácter o cadena gráfica, el CCSID para los parámetros de cadena generados por el sistema se determina a partir de la opción PARAMETER CCSID que esté en vigor para la rutina. Por ejemplo, con una base de datos Unicode, puede especificar PARÁMETRO CCSID EBCDIC para que los parámetros de cadena generados por el sistema se devuelvan a la aplicación invocadora en EBCDIC.
- 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 VARIANT como sinónimo de DETERMINISTIC
- NOT NULL CALL como sinónimo de RETURNS NULL ON NULL INPUT
- LLAMADA NULA como sinónimo de LLAMADA NULA EN ENTRADA
- PARAMETER STYLE DB2SQL como sinónimo de PARAMETER STYLE SQL
- Se puede especificar TIMEZONE como alternativa a TIME ZONE.
Ejemplos para CREATE FUNCTION (escalar externo)
- Ejemplo 1
- Supongamos que desea escribir un programa de función externa en C que implemente la siguiente lógica:
La función debe devolver un valor nulo si y solo si uno de los argumentos de entrada es nulo. La forma más sencilla de evitar una llamada de función y obtener un resultado nulo cuando un valor de entrada es nulo es especificar RETURNS NULL ON NULL INPUT en la sentencia CREATE FUNCTION o permitir que sea el valor predeterminado. Escriba la declaración necesaria para registrar la función, utilizando el nombre específico MINENULL1.output = 2 * input - 4CREATE FUNCTION NTEST1 (SMALLINT) RETURNS SMALLINT EXTERNAL NAME 'NTESTMOD' SPECIFIC MINENULL1 LANGUAGE C DETERMINISTIC NO SQL FENCED PARAMETER STYLE SQL RETURNS NULL ON NULL INPUT NO EXTERNAL ACTION; - Ejemplo 2
- Supongamos que el usuario Smith quiere registrar una función externa llamada CENTER en el esquema SMITH. El programa de funciones se escribirá en C y será reentrante. Escriba la declaración que Smith necesita para registrar la función, dejando que Db2 genere un nombre específico para la función.
CREATE FUNCTION CENTER (INTEGER, FLOAT) RETURNS FLOAT EXTERNAL NAME 'MIDDLE' LANGUAGE C DETERMINISTIC NO SQL FENCED PARAMETER STYLE SQL NO EXTERNAL ACTION STAY RESIDENT YES; - Ejemplo 3
- Supongamos que el usuario McBride (que tiene autoridad administrativa) quiere registrar una función externa llamada CENTER en el esquema SMITH. McBride planes para dar a la función un nombre específico FOCUS98. El programa de funciones utiliza un bloc de notas para realizar una inicialización única y guardar los resultados. El programa de funciones devuelve un valor con un tipo de datos FLOAT. Escriba la declaración que necesita McBride para registrar la función y asegurarse de que cuando se invoque la función, devuelva un valor con un tipo de datos DECIMAL(8,4).
CREATE FUNCTION SMITH.CENTER (FLOAT, FLOAT, FLOAT) RETURNS DECIMAL(8,4) CAST FROM FLOAT EXTERNAL NAME 'CMOD' SPECIFIC FOCUS98 LANGUAGE C DETERMINISTIC NO SQL FENCED PARAMETER STYLE SQL NO EXTERNAL ACTION SCRATCHPAD NO FINAL CALL; - Ejemplo 4
- El siguiente ejemplo registra una función Java definida por el usuario que devuelve la posición de la primera vocal en una cadena. La función definida por el usuario está escrita en Java, se ejecutará en modo protegido y es el método FINDVWL de la clase JAVAUDFS.
CREATE FUNCTION FINDV (CLOB(100K)) RETURNS INTEGER FENCED LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'JAVAUDFS.FINDVWL' NO EXTERNAL ACTION CALLED ON NULL INPUT DETERMINISTIC NO SQL;
