View
217
Download
0
Category
Preview:
Citation preview
8/18/2019 Pl SQL Bloques
1/67
ETSISI
ETSISI
PL/SQL
• Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones•
Excepciones• Estructuras de control
•
8/18/2019 Pl SQL Bloques
2/67
ETSISI
ETSISI
PL/SQL, Introducción
PL/SQL:Es un lenguaje de programación estructurado deORACLE que amplia el SQL estándar:Permite:
Manipular datos de una BD Oracle Crear procedimientos estructurados: Usando técnicas de programación como bucles
For, While, etc.
Controlar errores con excepciones definidaspor el usuario o propias de Oracle Controlar las filas de una consulta una a una Crear disparadores/ triggers
8/18/2019 Pl SQL Bloques
3/67
ETSISI
ETSISI
PL/SQL, Introducción
PL/SQL:Es un lenguaje de programación proceduralestructurado en bloques
Los programas se pueden dividir en bloques lógicos.Permite bloques anidados.Puede declarar variables localmente al bloque que lasutiliza.
8/18/2019 Pl SQL Bloques
4/67
ETSISI
ETSISI
PL/SQL, BloquesSe distingue entre bloques:Compilados y guardados
• Subprogramas: procedimientos, paquetes, funciones:– Se compilan y guardan en la BD– Se ejecutan mediante llamadas explicitas.
Compilados en tiempo de ejecución
• Triggers, el código fuente se guarda y se compila al
llamarle, se ejecutan implícitamente• Bloques anónimos, se compilan en el momento, no se
guardan.
8/18/2019 Pl SQL Bloques
5/67
ETSISI
ETSISI
PL/SQL, Bloques
Bloque: es la unidad más pequeña de un programaPL/SQL.Estructura de bloque:Cada estructura PL/SQL comprende uno o más
bloques. Éstos pueden estar separados o anidados[DECLARE]........BEGIN
......[EXCEPTION]........END;
8/18/2019 Pl SQL Bloques
6/67
ETSISI
ETSISI
PL/SQL, Bloques
DECLARE(No es obligatoria)
Debe de contener todas las constantes, variables yexcepciones definidas por el usuario y que se referenciana lo largo de las siguientes secciones.BEGINSección obligatoria, parte ejecutable, contiene lassentencias SQL para manipular datos de la BD ysentencias PL/SQL para manipular datos del bloque.EXCEPTION
Sección no obligatoria, controla los errores de ejecución,ofrece una salida controlada a las condiciones anormalesde la sección ejecutable.END; (Obligatorio, cierra el bloque)
8/18/2019 Pl SQL Bloques
7/67
ETSISIETSISI
BLOQUES, AnidamientoBEGIN
DECLAREVar X...............BEGIN
DECLARE
Var Y............BEGIN...........EXCEPTION..............END;...........
EXCEPTION..............END;
END;
Ámbito de la
variable XÁmbito de la
variable Y
8/18/2019 Pl SQL Bloques
8/67
ETSISIETSISI
PL/SQL, BloquesBloques Anónimos
DECLAREDefine objetos PL/SQL que utiliza la parte Begin o
Exception de este mismo bloque.
BEGIN obligatorio Sentencias
EXCEPTION
Control de errores END; obligatorio
8/18/2019 Pl SQL Bloques
9/67
ETSISIETSISI
PL/SQL
• Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones•
Excepciones• Estructuras de control•
8/18/2019 Pl SQL Bloques
10/67
ETSISIETSISI
PL/SQL: Bloques, Variables
Variables
• Variables PL/SQLDefinidas por el lenguaje
• Variables de sesión o usuarioDefinidas por el usuario en una sesión
EXEC DBMS_SESSION.SET_CONTEXT('CLIENTCONTEXT', 'myvar', 'myvalue');
SELECT SYS_CONTEXT('CLIENTCONTEXT', 'myvar') FROM dual;
8/18/2019 Pl SQL Bloques
11/67
ETSISIETSISI
Variables PL/SQLDefinidas por el lenguajeTipos de variables:
– Escalares. Definidos por el lenguaje
• NUMBER, CHAR, VARCHAR, VARCHAR2, DATE,BOOLEAN (TRUE, FALSE, NULL)– Compuestos: Definidos por el usuario
• Registros• Tablas y matrices. Pueden almacenar registros y
escalares
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
12/67
ETSISIETSISI
PL/SQL: Bloques, VariablesVariables PL/SQLDefinidas por el lenguajeSintaxisNombre_V [CONSTANT] tipo de datos
[NOT NULL] [:= expresión | := DEFAULT expresion];Expresion puede ser un literal, otra variable o unaexpresión aritmética.
Tipos de expresiones:
– Aritméticas: + - * /– Comparativas: = != > > >=
8/18/2019 Pl SQL Bloques
13/67
ETSISIETSISI
Variables PL/SQLEjemplos
V_fecha DATE;
V_departamento NUMBER (3) NOT NULL :=15;
V_ciudad VARCHAR2(15) :=‘MADRID’;
C_constante CONSTANT NUMBER :=100;
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
14/67
ETSISIETSISIdic-15 Concepción M. Gascueña 14
PL/SQL: Bloques, Variables
SECUENCIASUna secuencia genera números únicos de forma automática.Puede ser compartida por varios usuariosCrear una secuencia
CREATE SEQUENCE seq_nombre[INCREMENT BY n], (n es el incremento, por defecto es 1) [START WITH n], (n es el número por el que empieza la
secuencia ) [MAXVALUE n], (n es el máximo valor que puede alcanzar) [MINVALUE n], (n es el mínimo valor que puede alcanzar)
................. ;
8/18/2019 Pl SQL Bloques
15/67
ETSISIETSISIdic-15
SECUENCIAS: NEXTVAL Y CURRVAL NEXTVAL:
seq_nombre.NEXTVAL se utiliza para obtener el
próximo número de una secuenciaCURRVAL:seq_nombre.CURRVAL hace referencia al últimonúmero generado de la secuencia
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
16/67
ETSISIETSISIdic-15
SECUENCIAS: NEXTVAL Y CURRVAL
Para modificar la estructura de la secuencia
ALTER SEQUENCE seq_nombre
INCREMENTE BY n
MAXVALUE m
MINVALUE p;Borrar una secuencia
DROP SEQUENCE seq_nombre;
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
17/67
ETSISIETSISI
PL/SQL: Bloques, VariablesVariables PL/SQL
Se pueden declarar variables basadas en:– Otras variables previamente declaradas. Para ello se
utiliza %TYPE, precedido por nombre de la variable
– Basadas en una columna de una tabla existente en laBD, con %TYPE precedido del nombre de la tabla ycolumna.
Ejemplo:
– Var_inventario Number(7,2) ;
– Var_ media_inventario Var_inventario.% TYPE:=0;La variable Var_inventario debe de existir
8/18/2019 Pl SQL Bloques
18/67
ETSISIETSISI
Variables PL/SQLEjemploV_nif proveedores.CODPROV %TYPE;
Variable del mismo tipo que la columna codprov dela tabla proveedoresVar_articulo Almacenes.articulo.%TYPE
Las tablas y columnas debe de existir en la BD
Los nombres de las variables no deben ser iguales quelos de las columnas de las tablas utilizadas en elbloque.
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
19/67
ETSISIETSISI
Variables PL/SQL
%ROWTYPESe puede declarar una variable registro basándose enuna colección de columnas de una tabla existente en la
base de datosLos campos toman los nombres y tipos de datos de lascolumnas de dicha tabla.Var_registro tabla%ROWTYPE;
EjemploRegistroAlmacen Almacen%ROWTYPE;
Variable de tipo registro de la tabla almacén
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
20/67
ETSISIETSISI
Variables PL/SQL
Utilidades: INTOPara recoger el resultado de un Select en unavariable se utiliza INTO.SELECT * INTO variableTiporegistroFROM tabla
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
21/67
ETSISIETSISI
Variables PL/SQLEjemploIntroduce en el registro Vr_proveedor todos losvalores del proveedor 101;
Vr_proveedor proveedores.%ROWTYPESELECT * INTO Vr_proveedorFROM proveedores
WHERE codprov=101;Si la consulta devolviera más de un registro daría unerror.
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
22/67
ETSISIETSISI
Variables PL/SQLEjemplo
Introduce en la variable precio_arti, de tipo precio, elvalor del precio manipulado, para el articulo 104 .precio_arti proveedores. precio %TYPE;
SELECT precio *15 INTO precio_arti
FROM articulos WHERE codart=104;
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
23/67
ETSISIETSISI
Función DescripciónTo_Number(argumento) Convierte el argumento en tipo Number
To_Char(argumento) Convierte el argumento en tipo Varchar2
To_Date(argumento) Convierte el argumento en tipo Date
PL/SQL: Bloques, VariablesVariables PL/SQLConversiones de datos• Entre escalares se pueden convertir datos de unos
tipos de datos a otros:
8/18/2019 Pl SQL Bloques
24/67
ETSISIETSISI
Variables de usuarioVariables usadas desde el editor de SQLDEFINE variable1= 31; (crea una variable y asigna valor
31) SELECT * FROM AlumnoWHERE Cod_grupo =&variable1;
UNDEFINE variable1; (borra la variable) DEFINE variable1 = 'C01';
SELECT * FROM conductores
WHERE Codc = '&variable1';
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
25/67
ETSISIETSISI
Variables de usuario
SELECT *FROM AlumnoWHERE Cod_grupo =&variable1;
Pide valor por pantalla para Cod_grupo en tiempo deejecución, si la variable variable1 no existe la crea, siexiste toma el valor de ésta.SELECT *
FROM conductores
WHERE Codc ='&variable2';
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
26/67
ETSISIETSISI
Variables de usuario
Ejemplos:SELECT *FROM Alumno
WHERE Ciudad =‘&ciud’;SELECT &colum, NombreFROM AlumnoWHERE Cod_matricula =&cod_ma;
SELECT &codgru, CiudadFROM AlumnoWHERE &condicion;
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
27/67
ETSISIETSISI
Variables de usuarioLas variables de sesión deben referenciarse con &.DEFINE; presenta todas las variables de usuario de la
sesiónCrear un fichero interactivo que pida al usuario losdatos para crear una vista, utilizar los comandosACCEPT variable PROMT para comunicar al usuario lo
que se quiere.
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
28/67
ETSISIETSISI
Variables de usuario
Crear un fichero en el bloc de notas con lassiguientes sentencias:ACCEPT profe PROMPT ‘proporciona un nombre deprofesor: ‘
SELECT *FROM ProfesorWHERE Nombre = ‘&profe’
Guardar en C con el nombreINTERACTIVOProfesor.sqlAbrir desde SQL*PlusEjecutar con Start INTERACTIVOProfesor.sql;
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
29/67
ETSISIETSISI
Variables de usuarioPodemos crear una vista sobre una tabla pidiendo losdatos al usuario.ACCEPT nombrevista PROMPT 'introduce un nombre
para la vista:'ACCEPT nombretabla PROMPT 'introduce un nombrepara la tabla:'Create or replace view &nombrevista asSELECT * FROM &nombretabla;
PL/SQL: Bloques, Variables
8/18/2019 Pl SQL Bloques
30/67
ETSISIETSISI
PL/SQL
• Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones•
Excepciones• Estructuras de control•
8/18/2019 Pl SQL Bloques
31/67
ETSISIETSISI
PL/SQL, BloquesEstructura de Bloque en Subprogramas PL/SQLCabecera (procedimiento o función, nombre, lista deparámetros de entrada IN, salida OUT,entrada/salida IN OUT)
IS variablesDeclaración de objetos: constantescursores, etc..
BEGIN
Sentencias ejecutables[RETURN] (sólo para funciones) EXCEPTIONSección de excepcionesEND;
8/18/2019 Pl SQL Bloques
32/67
ETSISIETSISI
PL/SQL, Procedimientos
Subprogramas, programas compilados yguardados en la BD.
– Mejoran el Mantenimiento
– Mejoran la Seguridad e Integridad de losdatos– Mejoran el Rendimiento
8/18/2019 Pl SQL Bloques
33/67
ETSISIETSISI
PL/SQL, Programas
REGLASAcabar los procedimientos creados directamente en SQLcon un punto para salir de las sentencias, después/EXECUTE Nombre_Procedimiento; (ejecuta el
procedimiento) Si acaba bien avisa:Procedimiento PL/SQL terminado con éxito.
Si hay errores avisa:
Errores para PROCEDURE Nombre_Procedimiento.Si tiene algún error: sale lista de errores, llamando aSHOW ERRORS; ( presenta los errores de compilación)
8/18/2019 Pl SQL Bloques
34/67
ETSISIETSISI
PL/SQL, Procedimientos
CREATE OR REPLACE PROCEDURENombre_Procedure (parametros no obligatorios)IS........
BEGIN...............EXCEPTION-----END Nombre_Procedure;
8/18/2019 Pl SQL Bloques
35/67
ETSISIETSISI
Ejemplo Dada la tabla prueba:PRUEBA ( cod_prueba Number(3),Fecha Date,Primary key (cod_prueba ));
Crear un bloque Anónimo, directamente en SQL con lo
siguiente:DECLAREBEGININSERT INTO PRUEBA VALUES (1,SYSDATE);
END;Se crea compila y ejecuta si no tiene errores de sintaxisComprobar que se ha ejecutado correctamente con
SELECT * FROM PRUEBA;
PL/SQL, Procedimientos
8/18/2019 Pl SQL Bloques
36/67
ETSISIETSISI
Ejemplo:Crear un procedimiento que al llamarlo inserte valores(número secuencial, usuario conectado y fecha delsistema) en la tabla Usuarioconex.
Crear previamente una tabla que recoja el usuario y lafecha de conexión.CREATE TABLE Usuarioconex (
numero NUMBER(3),usuario VARCHAR2 (10),fecha DATE,Primary key (numero ));
CREATE SEQUENCE SEC_USER;
PL/SQL, Procedimientos
8/18/2019 Pl SQL Bloques
37/67
ETSISIETSISI
Procedimiento que al llamarlo inserte valores (número secuencial,
usuario conectado y fecha del sistema) en la tabla Usuarioconex.
CREATE OR REPLACE PROCEDURE Conexiones ISBEGIN
INSERT INTO Usuarioconex VALUES(SEC_USER.NEXTVAL, USER, SYSDATE);
END Conexiones;
Ejecutar el procedimiento:EXECUTE Conexiones;SELECT * FROM Usuarioconex; ( para ver si se ha ejecutado )
PL/SQL, Procedimientos
8/18/2019 Pl SQL Bloques
38/67
ETSISIETSISI
Ejemplo: Crear un procedimiento que inserte un registro en latabla AlmacenesCREATE OR REPLACE PROCEDURE PRO_Almacenes( codigo IN VARCHAR2 ,ciudad IN VARCHAR2, provinciaIN VARCHAR2, articulo IN NUMBER, unidades INNUMBER) ISBEGININSERT INTO ALMACENES VALUES (codigo, ciudad,provincia, articulo, unidades);
END PRO_Almacenes; . /EXECUTE PRO_Almacenes (&codigo,‘&ciudad’, ‘&provincia’,&articulo, &unidades);Con & delante de la variable pide por panatlla los valores al
usuario
PL/SQL, Procedimientos
8/18/2019 Pl SQL Bloques
39/67
ETSISIETSISI
Procedimientos y Funciones
Borrar procedimientos y funcionesDROP PROCEDURE Nombre_Procedure;
DROP FUNCTION Nombre_Funcion;
8/18/2019 Pl SQL Bloques
40/67
ETSISIETSISI
PL/SQL
• Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones• Excepciones• Estructuras de control
•
8/18/2019 Pl SQL Bloques
41/67
ETSISIETSISI
PL/SQL, Funciones
Las funciones devuelven siempre un valor que hay querecoger en una variable.Solo se introducen los argumentos de entrada.
EjemploCrear una función PRECIOTOTAL que devuelva lasuma de los precios de los artículos de un determinadoproveedor de la tabla POVEEDORES, el cual se
introducirá por argumento.
8/18/2019 Pl SQL Bloques
42/67
ETSISIETSISI
CREATE OR REPLACE FUNCTION F_preciototal(cod IN proveedores.codprov%type)RETURN NUMBER IStot number;
BEGINSELECT Sum(precio) INTO totFROM proveedores, articulosWHERE codprov= cod
AND codprov=pro_codprov;RETURN (tot);END F_preciototal; ./(compilar sin errores o corregir éstos con Show errors)
PL/SQL, Funciones
8/18/2019 Pl SQL Bloques
43/67
ETSISIETSISI
EJECUTAR LA FUNCIÓN
Crear una variable de enlace de tipo Number, en elSQL PLUS:
VARIABLE VAR1 NUMBER;
Ejecutar la funciónEXECUTE :VAR1:=F_preciototal(103);
Avisa:
Procedimiento PL/SQL terminado con éxito.Imprimir por pantalla el valor de la funciónPRINT :VAR1;
PL/SQL, Funciones
8/18/2019 Pl SQL Bloques
44/67
ETSISIETSISI
PL/SQL
• Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones• Excepciones• Estructuras de control
•
8/18/2019 Pl SQL Bloques
45/67
ETSISIETSISI
Excepciones:– Una excepción se produce cuando ocurre un error en
un programa PL/SQL– Ocurre un error se lanza una excepción
• Si está controlada por el programa se trata en la zona de
Excepciones del bloque PL/SQL.• Si no está controlada el programa se detiene.
– Se pueden declarar por el usuario en la zonaDECLARE, se lanzan durante la ejecución con RAISE
y se tratan como el resto en la zona EXCEPTION– Hay excepciones definidas por ORACLE que selanzan automáticamente.
– Utilizan las funciones de error de SQL y PL/SQL
PL/SQL, Excepciones
8/18/2019 Pl SQL Bloques
46/67
ETSISIETSISI
Excepciones predefinidas por OracleEjemplo
DECLARE….
BEGIN…………..EXCEPTIONWHEN NO_DATA_FOUND THENsentencias que quiero realizar
END
PL/SQL, Excepciones
8/18/2019 Pl SQL Bloques
47/67
ETSISIETSISI
Excepciones definidas por el usuarioEjemploDECLAREUser_exception EXCEPTION;BEGIN
If var>8 then RAISE User_exception …………..EXCEPTIONWHEN User_exception THEN
Rollback;DBMS_OUTPUT.PUT(‘Mensaje’);
WHEN OTHER THEN----------
END
PL/SQL, Excepciones
Se declara la
excepción
Se produce el error y se
genera la excepción con
RAISE
Se trata la excepción
8/18/2019 Pl SQL Bloques
48/67
ETSISIETSISI
Mensajes de error cuando se provoca una excepción:
DBMS_OUTPUT.put_line(‘Mensaje aviso al usuario’)
Para los mensajes de error definidos por el usuario
RAISE_APPLICATION_ERROR(,)Donde:
error_num es un entero negativo comprendido entre
-20000 y -20999mensaje: que avisa al usuario de lo que ocurre
PL/SQL, Excepciones
/
8/18/2019 Pl SQL Bloques
49/67
ETSISIETSISI
La excepción Other
WHEN OTHERS THENRutina especial que se ejecuta para todas las excepciones no
tratadas con anterioridad en la zona EXCEPTION. Debe deir la última dentro de ella
Con SQLCODE se recupera el código de error contempladopor Oracle que provoda la excepciónSQLERRM permite recuperar el texto asociado al codigo
de error actual que ha provocado la excepción.Por ejemploDBMS_OUTPUT.put_line('Error'||SQLCODE||SQLERRM)
PL/SQL, Excepciones
/ E
8/18/2019 Pl SQL Bloques
50/67
ETSISIETSISI
Ejemplo 1
CREATE FUNCTION divide(dividendo NUMBER, divisorNUMBER) IS Return Number;DECLARE
resul Number;BEGIN
resul=dividendo/divisor;EXCEPTIONWHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero)
DBMS_OUTPUT.PUT_LINE(‘No puedes dividir por cero’);
WHEN OTHERS THENRAISE_APPLICATION_ERROR(-20001, ‘Hay un error no definido');END;
PL/SQL, Excepciones
PL/ L E
8/18/2019 Pl SQL Bloques
51/67
ETSISIETSISI
Ejemplo 2
CREATE FUNCTION divide(dividendo NUMBER, divisorNUMBER) IS Return Number;DECLARE
resul Number;errNum Number;
BEGINresul=dividendo/divisor;
EXCEPTIONWHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero)
DBMS_OUTPUT.PUT_LINE(‘No puedes dividir por cero’);WHEN OTHERS THENerrNum := SQLCODE; /*NUMERO DE ERROR DE sql*/RAISE_APPLICATION_ERROR(-20000, errNum);
END;
PL/SQL, Excepciones
PL/ QL E
8/18/2019 Pl SQL Bloques
52/67
ETSISIETSISI
Algunas excepciones predefinidas por OracleDUP_VAL_ON_INDEXEsta excepción se crea cuando se intenta almacenar unvalor duplicado en la clave primaria o en una columna conrestricción UNIQUE. SQL_CODE= -1 (ORA-00001)INVALID_NUMBEREn una sentencia SQL, una cadena de caracteres norepresenta un número válido. SQL_CODE= -1722NO_DATA_FOUNDNo se encuentran valores en alguna acción SQL pedida.SQL_CODE= 100
NOTA : SQL_CODE: es el número de error interno de
Oracle. Está asociado a un mensaje.
PL/SQL, Excepciones
PL/SQL E i
8/18/2019 Pl SQL Bloques
53/67
ETSISIETSISI
Algunas excepciones predefinidas por OracleTOO_MANY_ROWSUna sentencia SELECT INTO devuelve más de una fila.SQL_CODE= -1422ZERO_DIVIDE THENS e ejecuta cuando se intenta dividir por cero. SQL_CODE=-1476VALUE_ERROR
Ocurre un error aritmético, de conversión o truncamiento.Por ejemplo cuando se intenta introducir un valor mayor queel tamaño de la variable SQL_CODE= -6502
PL/SQL, Excepciones
PL/SQL
8/18/2019 Pl SQL Bloques
54/67
ETSISIETSISI
PL/SQL
• Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones• Excepciones• Estructuras de control
•
8/18/2019 Pl SQL Bloques
55/67
ETSISIETSISI
PL/SQL, Estructuras de Control
BUCLES• Bucles simples (LOOP).
• Bucles condicionales (WHILE)
• Bucles numéricos (FOR)
8/18/2019 Pl SQL Bloques
56/67
ETSISIETSISI
IF THEN sentencias; END IF;IF THEN sentencias 1ELSE sentencias 2
END IF;
IF THEN sentencias 1ELSIF THEN sentencias 2;…………………
ELSIF THEN Sentencias n;END IF;
PL/SQL, Estructuras de Control
8/18/2019 Pl SQL Bloques
57/67
ETSISIETSISI
Bucles: Repiten una sentencia o una secuencia desentencias varias vecesTres tipos de bucles
– Bucle Básico LOOP, acciones repetitivas sin
condiciones. EXIT condición (para salir del bucle)– Bucle FOR, control iterativo de acciones un
número determinado de veces– Bucle WHILE, control iterativo basándose en una
condición.– END terminan los bucles;
PL/SQL, Estructuras de Control
8/18/2019 Pl SQL Bloques
58/67
ETSISIETSISI
LOOPSentencia 1;………………
EXIT [WHEN condición];
END LOOP;Condición es una expresión o variable booleana (TRUE,FALSE, NULL);Mientras no se cumpla la condición el bucle se sigue
ejecutando
PL/SQL, Estructuras de Control
8/18/2019 Pl SQL Bloques
59/67
ETSISIETSISI
Bloque anónimo:DeclareVar_contador NUMBER :=1;SALIR BOOLEAN :=FALSE;BEGIN
LOOPVar_contador:= Var_contador+1;INSERT INTO PRUEBA VALUES (Var_contador,SYSDATE);IF Var_contador = 5 THENSALIR:=TRUE;END IF;
EXIT WHEN SALIR;END LOOP;
END;
PL/SQL, Estructuras de Control
8/18/2019 Pl SQL Bloques
60/67
ETSISIETSISI
PL/SQL, Bucle FORFOR Var_contador IN [REVERSE] Mínimo…Máximo
LOOPSentencias1;………………..Sentencias n;
END LOOP;– Var_contador, variable que no hace falta declararpreviamente, actúa como variable contador, con INaumenta de uno en uno y no hay que actualizar.
– Cuando recorre todos los valores del rango acaba elbucle.
– Var_contador , con Reverse, empieza en Máximo ydecrementa de uno en uno hasta Mínimo
8/18/2019 Pl SQL Bloques
61/67
ETSISIETSISI
PL/SQL, Bucle FOREjemplo
Bloque anónimo utilizando FORDECLARE
BEGIN
FOR i IN 1..4LOOP
INSERT INTO USUARIOCONEX VALUES(SEC_USER.NEXTVAL, USER, SYSDATE);
END LOOP;
END;
Realiza el bucle cuatro veces
8/18/2019 Pl SQL Bloques
62/67
ETSISIETSISI
PL/SQL, Bucle WHILE
WHILE condiciónLOOPSentencia 1;
……………..Sentencia n;
END LOOP;
La condición es evaluada en cada iteración y mientrassea TRUE, se ejecutan las sentencias reiteradamente.
8/18/2019 Pl SQL Bloques
63/67
8/18/2019 Pl SQL Bloques
64/67
ETSISIETSISI
PL/SQL, Estructuras de Control
Ejecutar el procedimiento llamándoloEXECUTE Preciomaximo(5);EXECUTE Preciomaximo(50);HACER COMMIT;
Select* from articulos;Select * from prueba;
Realiza un procedimiento llamado MAXIMOPROV,que controle un error en la sección EXCEPTION
CREATE OR REPLACE PROCEDURE MAXIMOPROV (MAXIM
8/18/2019 Pl SQL Bloques
65/67
ETSISI
E E E L E EDU E M X M V (M X MIN NUMBER ) ISPRECIOMAX ARTICULOS.PRECIO%TYPE :=0;
BEGINWHILE PRECIOMAX < MAXIM loopSELECT MAX(ARTICULOS.PRECIO) INTO PRECIOMAX
FROM ARTICULOS GROUP BY PRO_CODPROV;INSERT INTO PRUEBA VALUES (MAXIM, SYSDATE);PRECIOMAX := MAXIM;
END LOOP;EXCEPTION
WHEN TOO_MANY_ROWS THENRAISE_APPLICATION_ERROR(-20000, 'HOLAhay Demasiados registros');
END MAXIMOPROV;
8/18/2019 Pl SQL Bloques
66/67
ETSISI
create or replace
PROCEDURE XXXXXXX as
ide SE.id_e% TYPE;
cantidad integer;
CURSOR cursor_1 IS SELECT Id_E , COUNT(*) as cantidad
FROM SEGROUP BY Id_E
HAVING COUNT(*) = (
SELECT NE FROM E
WHERE E.id_E = SE.Id_E
);
fila cursor_1%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Resultado de la consulta');
OPEN cursor_1;
LOOP
FETCH cursor_1 INTO fila;
EXIT WHEN cursor_1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Id= '|| to_Char(fila.Id_E)||' cantidad= '||to_Char(fila.cantidad));
END LOOP;
CLOSE cursor_1;
END XXXXXXX;
8/18/2019 Pl SQL Bloques
67/67
Nota: El punto y barra que aparecen al final de
los procedimientos y funciones ./ son
opcionales y significan el punto archiva en
procedimiento y la barra comprueba la
sintaxis.
Recommended