La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

PL/SQL Francisco Moreno Universidad Nacional. Funciones Si un procedimiento tiene solo un parámetro de salida, se puede remplazar por una función y esta.

Presentaciones similares


Presentación del tema: "PL/SQL Francisco Moreno Universidad Nacional. Funciones Si un procedimiento tiene solo un parámetro de salida, se puede remplazar por una función y esta."— Transcripción de la presentación:

1 PL/SQL Francisco Moreno Universidad Nacional

2 Funciones Si un procedimiento tiene solo un parámetro de salida, se puede remplazar por una función y esta se puede involucrar directamente en expresiones y en consultas SQL. Sintaxis: FUNCTION CREATE [OR REPLACE] FUNCTION nombre_función [( arg1 [modo] tipo [, arg2 [modo] tipo...])] RETURN tipo_de_dato IS Bloque de PL/SQL

3 Ejemplo CREATE OR REPLACE FUNCTION area_circulo(radio IN NUMBER) RETURN NUMBER IS pi CONSTANT NUMBER(5,4) := 3.1416; BEGIN RETURN (radio * radio * pi); END; / Invocación en SQL*Plus: VAR a NUMBER; EXECUTE :a := area_circulo(3); PRINT a;

4 Recursividad CREATE OR REPLACE FUNCTION sumadigit(n IN NUMBER) RETURN NUMBER IS suma NUMBER(3); tamano NUMBER(38); BEGIN suma := SUBSTR(n,1,1); tamano := LENGTH(n); IF tamano > 1 THEN suma := suma + sumadigit(SUBSTR(n,2,tamano)); END IF; RETURN suma; EXCEPTION WHEN OTHERS THEN RETURN 0; END; / Límite: 38 dígitos (NUMBER) Ejercicio: pulir para decimales y negativos.

5 Invocación de la función desde una consulta: CREATE TABLE numero( num NUMBER(30) PRIMARY KEY); INSERT INTO numero VALUES(1); INSERT INTO numero VALUES(111); INSERT INTO numero VALUES(123456789); SELECT num, sumadigit(num) AS sumin FROM numero;

6 Otro ejemplo: ¡un programa que crea otros programas!Elaborar una función llamada crea_sub que recibe como parámetro el código fuente de un subprograma (en una cadena de caracteres) y lo crea (o lo remplaza si ya existía). Es decir, ¡un programa que crea otros programas! La función retorna Creación exitosa si no hubo problemas en la creación del subprograma o el mensaje de error de lo contrario.

7 CREATE OR REPLACE … END; El usuario ingresa en un campo de texto el código del programa que desea crear Se le envía la cadena de texto con el código fuente a la función crea_sub crea_sub recibe el código fuente y crea el programa que el usuario desea

8 CREATE OR REPLACE FUNCTION crea_sub(codigo_fuente IN VARCHAR) RETURN VARCHAR IS BEGIN EXECUTE IMMEDIATE codigo_fuente; RETURN 'Creación exitosa'; EXCEPTION WHEN OTHERS THEN RETURN 'Error mortal: ' || SQLERRM; --Hubo errores END; /

9 Ejemplo de invocación: BEGIN DBMS_OUTPUT.PUT_LINE(crea_sub('CREATE OR REPLACE FUNCTION hoy RETURN DATE IS BEGIN RETURN SYSDATE; END;')); END; / El código en verde sería el que el usuario ingresaría a través de una interfaz en un campo de texto. Más adelante en el curso se verá como hacerlo, por ejemplo, desde Java.

10 Paquetes Un paquete es una agrupación de funciones, procedimientos y variables. Clasifican los subprogramas de acuerdo con una categoría elegida por el programador o diseñador Un paquete se compone de dos partes: –Especificación Definiciones de variables públicas y prototipos de los subprogramas –Cuerpo (BODY) Implementación de los subprogramas declarados en la especificación más subprogramas y variables privadas

11 CREATE PACKAGE nom_paquete IS -- Variables públicas -- Declaración de subprogramas (públicos) END; / BODY CREATE PACKAGE BODY nom_paquete IS -- Variables privadas /* Implementación de subprogramas privados */ /* Implementación de subprogramas declarados en la especificación */ END; / SintaxisESPECFICACIÓN CUERPO Los subprogramas privados se deben implementar antes que los públicos

12 Ejemplo: Especificación CREATE OR REPLACE PACKAGE mat IS TYPE t_num IS TABLE OF NUMBER(3) INDEX BY BINARY_INTEGER; PROCEDURE mulvec(vec IN OUT t_num); FUNCTION cadvalores(vec IN t_num) RETURN VARCHAR; END; --Fin de la especificación /

13 Ejemplo: Cuerpo CREATE OR REPLACE PACKAGE BODY mat IS PROCEDURE mulvec(vec IN OUT t_num) IS i NUMBER := vec.FIRST; BEGIN WHILE i IS NOT NULL LOOP vec(i) := vec(i) * i; i := vec.NEXT(i); END LOOP; END; Continúa

14 Cont. cuerpo FUNCTION cadvalores(vec IN t_num) RETURN VARCHAR IS k NUMBER; cad VARCHAR(2000); BEGIN k := vec.FIRST; WHILE k IS NOT NULL LOOP cad := cad || ' ' || vec(k); k := vec.NEXT(k); END LOOP; RETURN cad; END; END; --Fin del cuerpo del paquete /

15 DECLARE mi_vec mat.t_num; k NUMBER; BEGIN mi_vec(1):= 5; mi_vec(2):= 10; mi_vec(3):= 80; DBMS_OUTPUT.PUT_LINE(mat.cadvalores(mi_ve c)); mat.mulvec(mi_vec); DBMS_OUTPUT.PUT_LINE(mat.cadvalores(mi_ve c)); END; /


Descargar ppt "PL/SQL Francisco Moreno Universidad Nacional. Funciones Si un procedimiento tiene solo un parámetro de salida, se puede remplazar por una función y esta."

Presentaciones similares


Anuncios Google