Funciones personalizadas de DB2
1. Funciones personalizadas
Primero cree una función simple y devuelva los parámetros de entrada tal como están.
CREAR FUNCIÓN ADMINISTRATOR.FUN1
(AAA VARCHAR(4)
)
DEVUELVE VARCHAR(4)
SPECIFIC ADMINISTRATOR.FUN1
(AAA VARCHAR(4)
)
Devuelve los parámetros de entrada. p> IDIOMA SQL
NO DETERMINISTA
LEE DATOS SQL
ENVÍO ESTÁTICO
LLAMADO EN ENTRADA NULA
ACCIÓN EXTERNA
HEREDAR REGISTROS ESPECIALES
COMENZAR ATÓMICO
DECLARAR bbb VARCHAR(4);
set bbb = aaa;
return bbb;
END;
Este es el código fuente generado por el programa auxiliar. En el código fuente generado, podemos encontrar las siguientes características:
1. Agregar (el tipo de datos del nombre del parámetro de entrada) al definir el nombre de la función
2. tipo del valor de retorno
3. Utilice BEGIN ATOMIC y END como etiquetas de inicio y fin
4. Establezca la asignación de definición
5. definir el valor de retorno
¿Cómo podemos decir que no se encontró la función creada exitosamente? No lo tome literalmente. Lo más probable es que esto se deba a una discrepancia en los tipos de datos de los parámetros de función que ingresó. Esto no se llama polimorfismo en términos orientados a objetos.
CREAR FUNCIÓN ADMINISTRATOR.FUN2
(AAA ENTERO
)
DEVUELVE UN ENTERO
ADMINISTRADOR.FUN2 ESPECÍFICO
SQL06022011175SQL060220111756000
IDIOMA SQL
NO DETERMINISTA
LEE DATOS SQL
ENVÍO ESTÁTICO
LLAMADO EN ENTRADA NULA
ACCIÓN EXTERNA
HEREDAR REGISTROS ESPECIALES
COMENZAR ATÓMICO
DECLARAR bbb INTEGER;
set bbb = aaa;
return bbb;
END;
La función escrita arriba es lo que se llama, y lo que se hace a continuación es tratar con la base de datos. De todos modos, las funciones se utilizan principalmente para el control y el valor de retorno es único.
CREAR FUNCIÓN ADMINISTRATOR.FUN3 (AAA INTEGER )
DEVUELVE VARCHAR(20)
IDIOMA SQL
COMENZAR ATÓMICO
DECLARE bbb VARCHAR(20);
establece bbb = (seleccione MES de IWH.LOOKUP_TIME donde MONTH_ID = AAA);
Devuelve bbb;
FIN;
Está bien, eso es todo.
2. Procedimientos almacenados
Los procedimientos almacenados son muy similares a las funciones. Son solo para una parte de la lógica para la ejecución por lotes, no para el valor de retorno, y el formato definido es algo. diferente.
db2 proporciona muchos ejemplos; a continuación se muestran las definiciones de cursores y bucles.
------------------------------------------- ----- ----------------------------------
--Materiales con licencia - Propiedad de IBM
--
-- Se rige según los términos del Acuerdo Internacional
-- Licencia de Código de Muestra No Autorizado.
--
-- (C) COPYRIGHT International Business Machines Corp. 1995 - 2002
-- Todos los derechos reservados.
--
-- Derechos restringidos de los usuarios del gobierno de EE. UU.: uso, copia o
--Divulgación sujeta al contrato de GSA ADP Schedule con límite de IBM Corporation.
---------------------------------------- --- ----------------------------------
--
-- Nombre del archivo fuente: loop.db2
--
-- Ejemplo: Para crear el procedimiento almacenado SQL LOOP_UNTIL_SPACE
--
-- Para crear un procedimiento almacenado SQL:
-- 1. Conéctese a la base de datos
-- 2. Ingrese el comando "db2 -td@ -vf loop.db2 "
--
-- Llame a un procedimiento almacenado SQL desde la línea de comando:
-- 1. Conéctese a la base de datos
-- 2. Introduzca el siguiente comando:
-- db2 "CALL loop_until_space (?)"
--
-- 2.
-- p>
-- También puede utilizar el bucle .sqc
-- archivo fuente en el directorio de muestras sqlproc, compilando y ejecutando
-- "Bucle" del cliente SQL incorporado en C para llamar a este procedimiento almacenado SQL.
------------------------------------------- ----- -----------------------------------
--
-- Para obtener más información sobre el script de muestra, consulte el archivo README.
--
--Para obtener información sobre la creación de programas SQL, consulte Aplicaciones
-- Guía de desarrollo.
--
-- Para obtener información sobre el uso de sentencias SQL, consulte la referencia de SQL.
--
-- Para obtener la información más reciente sobre programación, creación y ejecución de aplicaciones DB2
--, visite el sitio web de desarrollo de aplicaciones DB2: p>
-- p>
--/data/db2/udb/ad
--------------------- ------- ------------------------------------------- -------
CREAR PROCEDIMIENTO loop_until_space(OUT contador INT)
IDIOMA SQL
COMENZAR
DECLARE v_firstnme VARCHAR( 12);
DECLARE v_midinit CHAR(1);
DECLARE v_lastname VARCHAR(15);
DECLARE v_counter SMALLINT DEFAULT 0;
DECLARAR EL CURSOR c1 PARA
SELECCIONAR nombre, midinit, apellido
DEL empleado
ORDENAR POR midinit DESC;
DECLARAR CONTINUAR MANEJADOR PARA NO ENCONTRADO p>
SET contador = -1;
-- Inicializar parámetros OUT
SET contador = 0;
OPEN c1;
fetch_loop:
LOOP
FETCH c1 INTO
v_firstnme, v_midinit, v_lastname;
-- Utilice variables locales para variables iteradoras
-- Porque los procedimientos almacenados SQL solo permiten la asignación de parámetros OUT
-- Valor
SET v_counter = v_counter + 1;
IF v_midinit = ' ' ENTONCES
DEJAR fetch_loop;
FINALIZAR SI;
FINALIZAR BUCLE fetch_loop;
CERRAR c1;
-- Ahora asigne el valor de la variable local
-- al parámetro OUT
SET counter = v_counter;
END; p>
Nota:
p>1. Está claro en los comentarios cómo crear y ejecutar. Cabe señalar que si desea eliminar el código para su ejecución, debe cambiar END @ a END;
2. No utilice C loop.sqc
3. Preste atención a la relación con la función Diferencias:
a) Las etiquetas de inicio y fin comienzan (fin) son diferentes
b) La definición del valor de retorno es diferente. defina el valor de retorno y OUT del nombre de la función. . . . . . Agregue definición a .
Definición de formato
1. (Número de departamento ENTRADA PEQUEÑO, SALARIO medio SALARIO DOBLE)
Utilice (51, ????)
Para definir un valor de retorno, agregue OUT en lugar de return en la definición.
2. Cursor
DECLARAR C1 CURSOR PARA
SELECCIONAR nombre, medio, apellido
DEL empleado
ORDENAR POR midinit DESC;
DECLARAR CONTINUAR MANEJADOR PARA NO ENCONTRADO
SET contador = -1;
Abrir C1
Cerrar C1
FETCH c1 INTO
v_firstnme, v_midinit, v_ lastname;
3. Bucle bucle
fetch_loop:
BUCLE
FETCH c1 INTO
v_firstnme, v_midinit, v_lastname;
SET v_counter = v_counter + 1;
IF v_midinit = ' ' ENTONCES
SALIR fetch_loop;
FINALIZAR SI;
FINALIZAR BUCLE fetch_loop;
4.if
SI v_midinit = ' ' ENTONCES
DEJAR fetch_loop;
FINALIZAR SI
5.CASE v_mod
CUANDO 0 ENTONCES
FINALIZAR CASO;
6. MIENTRAS v_counter < (v_numRecords / 2 + 1) HACER
SET v_salary1 = v_salary2;
FETCH c1 INTO v_salary2;
SET v_counter = v_counter + 1;
TERMINAR MIENTRAS;
7.