Está en la página 1de 44

PL SQL

INTRODUCCIÓN
(continuación)
Lic Cristian Mercado Quispe
Base de Datos II

Lic. Cristian Mercado Quispe - UPEA


Manejos de Estructuras de control
 CASE

CASE SELECTOR
WHEN EXPRESION1 THEN OPERACIÓN1;
WHEN EXPRESION2 THEN OPERACIÓN2;
……
ELSE OPERACIÓNN
END CASE;

Lic. Cristian Mercado Quispe - UPEA


Manejos de Estructuras de control
 CASE - CONDICIONES

CASE
WHEN CONDICIÓN1 THEN OPERACIÓN1;
WHEN CONDICIÓN2 THEN OPERACIÓN2;
……
ELSE OPERACIÓNN
END CASE;

Lic. Cristian Mercado Quispe - UPEA


EJEMPLO - CASE
DECLARE
nota INT := &var_sus;
BEGIN
CASE
WHEN nota<=50 THEN
dbms_output.put_line('DEFICIENTE');
WHEN nota<=60 THEN
dbms_output.put_line('SUFICIENTE');
WHEN nota<=80 THEN dbms_output.put_line('BUENO');
ELSE dbms_output.put_line('EXCELENTE');
END CASE;
END;
Lic. Cristian Mercado Quispe - UPEA
Manejos de Estructuras de control
 LOOP – Permite generar bucles, se repite tantas veces
sea necesario hasta forzar con la instrucción EXIT

LOOP
INSTRUCCIONES
IF(EXPRESIÓN) THEN
INSTRUCCIONES
EXIT;
END IF;
END LOOP;

Lic. Cristian Mercado Quispe - UPEA


EJEMPLO LOOP - Mostrar los números del 1 a n,
ingresando n por teclado.

DECLARE
n INT := &var_sus;
cont int:=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(cont);
cont:= cont +1;
IF cont>n THEN
EXIT;
END IF;
END LOOP;
END;
Lic. Cristian Mercado Quispe - UPEA
DECLARE
n INT := &var_sus;
cont int:=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(cont);
cont:= cont +1;
EXIT WHEN cont>n;
END LOOP;
END;
Lic. Cristian Mercado Quispe - UPEA
Manejos de Estructuras de control
 WHILE se repite mientras se cumpla la
expresión

WHILE (EXPRESION) LOOP


INSTRUCCIONES…
END LOOP;

Lic. Cristian Mercado Quispe - UPEA


DECLARE
n INT := &var_sus;
cont int:=1;
BEGIN
WHILE (cont<=n)LOOP
DBMS_OUTPUT.PUT_LINE(cont);
cont:=cont+1;
END LOOP;
END;
Lic. Cristian Mercado Quispe - UPEA
Manejos de Estructuras de control
 FOR se repite tantas veces como se defina en
los indicadores inicio y final

FOR CONTADOR IN [REVERSE ]INICIO..FINAL LOOP


INSTRUCCIONES…
END LOOP;

Lic. Cristian Mercado Quispe - UPEA


DECLARE
n INT := &var_sus;
cont int;
BEGIN
FOR CONT IN 1..N LOOP
DBMS_OUTPUT.PUT_LINE(CONT);
END LOOP;
END;

Lic. Cristian Mercado Quispe - UPEA


CURSORES
 Los cursores son punteros a unas zonas de
memoria llamadas áreas de contexto en las
cuales se almacena información acerca del
resultado de una consulta, así como el conjunto
de registros procesados y no procesados.
 Mediante este puntero (cursor), un programa
PL SQL puede controlar el área de contexto,
manejar y procesar el conjunto de registros
devueltos por una consulta.
Lic. Cristian Mercado Quispe - UPEA
Tipos de cursores
Cursores Implícitos
Este tipo de cursores se utiliza para operaciones
SELECT INTO. Se usan cuando la consulta
devuelve un único registro.

Cursores Explícitos
Son los cursores que son declarados y controlados
por el programador. Se utilizan cuando la consulta
devuelve un conjunto de registros.
Lic. Cristian Mercado Quispe - UPEA
Cursor Implícito
DECLARE
NOMBRE employees.first_name%type;
APELLIDO employees.last_name%type;
ID_EMP employees.employee_id%type := &id_empleado ;
BEGIN
SELECT first_name, last_name INTO NOMBRE, APELLIDO
FROM employees
WHERE employee_id = ID_EMP;
DBMS_OUTPUT.PUT_LINE('NOMBRE: ' || NOMBRE ||
'APELLIDO: ' || APELLIDO);
END;

Lic. Cristian Mercado Quispe - UPEA


Cursores Explícitos
Pasos:
1.Declarar el cursor
cursor c1 is Select * from employees;
2.Abrir el cursor
open c1;
3. Recuperar datos del cursor
fetch c1 into var1, var2,…., varn;
4. Cerrar el cursor
Close c1;
Lic. Cristian Mercado Quispe - UPEA
Lic. Cristian Mercado Quispe - UPEA
Propiedades de los cursores
%NOTFOUND
Una propiedad del cursor que devuelve FALSE
durante la recuperación de registros y TRUE al
finalizar la recuperación.

%ROWCOUNT
Número de registros recuperados dependiendo
del momento en que se encuentre.(Recuperando
registros o al finalizar la recuperación).
Lic. Cristian Mercado Quispe - UPEA
Propiedades de los cursores
%FOUND
Una propiedad del cursor que devuelve TRUE durante
la recuperación de registros y FALSE al finalizar la
recuperación.

%ISOPEN
Propiedad del cursor que devuelve FALSE antes de
abrir el cursor, devuelve TRUE al abrir y recuperar
datos del cursor y devuelve FALSE después de cerrar
el cursor.
Lic. Cristian Mercado Quispe - UPEA
Ejemplo de cursores
Utilizar un cursor para mostrar el nombre y
apellido de todos los empleados

Lic. Cristian Mercado Quispe - UPEA


Solución
DECLARE
CURSOR C1 is select first_name, last_name from employees;
nombre employees.first_name%type;
apellido employees.last_name%type;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO nombre,apellido;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (NOMBRE||' '|| APELLIDO);
END LOOP;
END;

Lic. Cristian Mercado Quispe - UPEA


Ejemplo de Cursores
 Modificar el anterior ejercicio para mostrar el
nombre y apellido de todos los empleados que
trabajan en el departamento 80.

Lic. Cristian Mercado Quispe - UPEA


DECLARE
CURSOR C1 is select first_name, last_name from employees WHERE
DEPARTMENT_id=80;
nombre employees.first_name%type;
apellido employees.last_name%type;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO nombre,apellido;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (NOMBRE||' '|| APELLIDO);
END LOOP;
DBMS_OUTPUT.PUT_LINE('NUMERO DE REGISTROS'||
C1%ROWCOUNT);
CLOSE C1;
END;
/

Lic. Cristian Mercado Quispe - UPEA


Ejemplo
 Crear un bloque anónimo que muestre los tres
departamentos que tienen más empleados:
 Ejemplo:

 NOMBRE: Shipping CANTIDAD: 45


 NOMBRE: Sales CANTIDAD: 34
 NOMBRE: Finance CANTIDAD: 6

Lic. Cristian Mercado Quispe - UPEA


Ejercicios
EJERCICIO 1
Crear un bloque anónimo que permita mostrar el
nombre del empleado y el nombre del
departamento donde trabaja

Lic. Cristian Mercado Quispe - UPEA


Ejercicios
EJERCICIO 2
Crear un bloque anónimo para obtener el listado
de todos los superiores de un empleado, ingresar
el id del empleado por teclado:
Ejemplo para el id 111, se debe mostrar:
Ismael
Nancy
Neena
Steven

Lic. Cristian Mercado Quispe - UPEA


EJERCICIO 3
Invertir los nombres de todos los empleados
Ejemplo:
Ellen nellE
Sundar radnuS
Mozhe ehzoM
David divaD

Lic. Cristian Mercado Quispe - UPEA


EJERCICIO 4
Crear un bloque anónimo que valide una
contraseña ingresada por teclado, la contraseña
deberá tener como mínimo 5 caracteres y como
máximo 10 caracteres. Además mínimamente
deberá tener una vocal minúscula y una vocal
Mayúscula.

Lic. Cristian Mercado Quispe - UPEA


 EJERCICIO 5
Crear la siguiente tabla:
 Producto(id_producto, nombre)

En la tabla creada registrar 10000 productos

Id_producto nombre
1 Producto1
2 Producto2
3 Producto3
4 Producto4
… ….
10000 producto10000

Lic. Cristian Mercado Quispe - UPEA


Ejercicios
 Crear un bloque anónimo que permita mostrar
a todos los empleados que trabajan en el
departamento de ‘MARKETING’
 Crear un bloque anónimo que muestre los
primeros N números de la serie de Fibonacci.
Ingresar N por teclado. Ejemplo si N=4; se
debe mostrar 0,1,1,2

Lic. Cristian Mercado Quispe - UPEA


PL SQL
EXCEPCIONES
Lic Cristian Mercado Quispe
Base de Datos II

Lic. Cristian Mercado Quispe - UPEA


Introducción
En Pl/SQL una excepción es una advertencia o condición
de error que puede ser capturada para asignar un nuevo
comportamiento. Las excepciones tienen su propio bloque
DECLARE
--declaraciones
BEGIN
--ejecución
EXCEPTION
--excepción
END;

Lic. Cristian Mercado Quispe - UPEA


Introducción
 Excepciones asociadas a cursores implícitos:

Excepción Explicación
NO_DATA_FOUND Se produce cuando una sentencia SELECT no
devuelve filas
TOO_MANY_ROWS Dado que cada cursor implícito sólo puede
recuperar una fila, esta excepción detecta la
existencia de más de una fila

Lic. Cristian Mercado Quispe - UPEA


Lic. Cristian Mercado Quispe - UPEA
EJEMPLO
DECLARE
NOMBRE EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
SELECT FIRST_NAME INTO NOMBRE FROM
EMPLOYEES;
DBMS_OUTPUT.PUT_LINE(NOMBRE);
END;

Lic. Cristian Mercado Quispe - UPEA


DECLARE
NOMBRE EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
SELECT FIRST_NAME INTO NOMBRE FROM
EMPLOYEES;
DBMS_OUTPUT.PUT_LINE(NOMBRE);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('LA SENTENCIA SQL
DEVUELVE DEMASIADOS REGISTROS');
END;
Lic. Cristian Mercado Quispe - UPEA
El siguiente bloque genera un error para el
empleado 500
DECLARE
NOMBRE EMPLOYEES.FIRST_NAME%TYPE;
IDEMP INT:= &VAR_SUS;
BEGIN
SELECT FIRST_NAME INTO NOMBRE FROM EMPLOYEES
WHERE EMPLOYEE_ID=IDEMP;
DBMS_OUTPUT.PUT_LINE(NOMBRE);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('LA SENTENCIA SQL
DEVUELVE DEMASIADOS REGISTROS'||SQlcode);
END;

Lic. Cristian Mercado Quispe - UPEA


Solución
DECLARE
NOMBRE EMPLOYEES.FIRST_NAME%TYPE;
IDEMP INT:= &VAR_SUS;
BEGIN
SELECT FIRST_NAME INTO NOMBRE FROM EMPLOYEES
WHERE EMPLOYEE_ID=IDEMP;
DBMS_OUTPUT.PUT_LINE(NOMBRE);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('LA SENTENCIA SQL DEVUELVE
DEMASIADOS REGISTROS');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO EXISTE EL EMPLEADO'||IDEMP);
END;

Lic. Cristian Mercado Quispe - UPEA


WHEN OTHERS
 Si no existe un bloque de control adecuado al
tipo de excepción, se ejecutara WHEN
OTHERS, el mismo que debe ser el último
manejador de excepciones.

Lic. Cristian Mercado Quispe - UPEA


DECLARE
NOMBRE EMPLOYEES.FIRST_NAME%TYPE;
IDEMP INT:= &VAR_SUS;
BEGIN
SELECT FIRST_NAME INTO NOMBRE FROM
EMPLOYEES
WHERE EMPLOYEE_ID=IDEMP;
DBMS_OUTPUT.PUT_LINE(NOMBRE);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('error en la ejecución');
END;
Lic. Cristian Mercado Quispe - UPEA
Excepciones predefinidas
Excepción Se Ejecuta cuando.. SQLCODE
ACCESS_INTO_NULL El programa intento asignar valores a los -6530
atributos de un objeto no inicializado
CURSOR_ALREADY_OP El programa intento abrir un cursor que se -6531
EN encontraba abierto
DUP_VAL_ON_INDEX El programa intentó almacenar valores -1
duplicados en una columna Primary Key
INVALID_CURSOR El programa intento realizar una operación -1001
no valida en un cursor
ROWTYPE_MISMATCH Los elementos de asignación tienen tipos de -6540
datos incompatiles
ZERO_DIVIDE El programa intentó efectuar una división -1476
por cero

Lic. Cristian Mercado Quispe - UPEA


Uso de SQLCODE y SQLERRM
SQLCODE devuelve el número de error de
oracle.
SQLERRM devuelve el correspondiente mensaje
de error.

Lic. Cristian Mercado Quispe - UPEA


DECLARE
NOMBRE EMPLOYEES.FIRST_NAME%TYPE;
IDEMP INT:= &VAR_SUS;
BEGIN
SELECT FIRST_NAME INTO NOMBRE FROM
EMPLOYEES
WHERE EMPLOYEE_ID=IDEMP;
DBMS_OUTPUT.PUT_LINE(NOMBRE);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE();
END;
Lic. Cristian Mercado Quispe - UPEA
Uso de SQLCODE y SQLERRM
Se puede pasar un número negativo que
represente un error de oracle y mostrar el
mensaje asociado:
DECLARE
Mensaje VARCHAR2(100);
BEGIN
Mensaje := SQLERRM(-1403);
DBMS_OUTPUT.PUT_LINE(mensaje);
END;
Lic. Cristian Mercado Quispe - UPEA
Ejemplo:
 Crear un bloque anónimo que muestre los
mensajes de los siguientes errores
 ORA-1
 ORA-1722
 ORA-6500
 ORA-1422

Lic. Cristian Mercado Quispe - UPEA

También podría gustarte