You are on page 1of 6

Introduction to Oracle: SQL and PL/SQL, Instructor Guide, Volumen 1

Práctica 23: Gestionando Excepciones


--------------------------------------------------------------------

Ejercicio 1:
Escribe un Bloque PL/SQL para seleccionar el nombre del empleado con un
valor de salario dado.
a) Si el salario ingresado retorna más de un registro, trate la ex
cepción con un gestor de excepción apropiado
e inserte dentro de la tabla MESSAGES el mensaje "Más de un Emp
leado con un salario de <salario>."
b) Si el salario ingresado no retorna ningún registro-fila, trate
la excepción con un gestor de excepción apropiado
e inserte dentro de la tabla MESSAGES el mensaje "Ningún emplea
do con un salario de <salario>".
c) Si el salario ingresado retorna un registro-fila solamente, i
nserte dentro de la tabla MESSAGES el nombre del empleado
y el monto del salario.
d) Trate cualquier otra excepción con un gestor de excepción apropia
do e inserte dentro de la tabla MESSAGES el mensaje
"Ocurrió algún otro error"
e) Testee el Bloque para una variedad de casos de prueba
"
RESULTS
-------
SMITH - 800
Mas de un empleado con un salario de 3000
Ningún empleado con un salario de 6000
"
Respuesta 1)
------------
SQL> TRUNCATE TABLE MESSAGES;
SQL> edit p23q1.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p23q1.sql
-----------------------------------------------------------------
"
/* SET SERVEROUTPUT ON */
ACCEPT p_sal PROMPT 'Por favor ingrese un valor de salario: ';
DECLARE
v_emp_sal EMP.SAL%TYPE := &p_sal;
v_emp_ename EMP.ENAME%TYPE;
-- 1.a) Declaración de la Excepción definida por usuario para caso q
ue retorna mas de un empleado con ese salario
exc_mas_de_uno EXCEPTION;
-- 1.b) Declaración de la Excepción definida por usuario para caso q
ue no retorna ningún empleado con ese salario
exc_ninguno EXCEPTION;
BEGIN
SELECT ENAME
INTO v_emp_ename
FROM EMP
WHERE SAL = v_emp_sal;
IF SQL%ROWCOUNT > 1 THEN
RAISE exc_mas_de_uno;
ELSIF SQL%ROWCOUNT = 0 THEN
RAISE exc_ninguno;
ELSIF SQL%ROWCOUNT = 1 THEN
--1.c) Caso Normal que retorna un empleado con ese salar
io ingresado
INSERT INTO MESSAGES
VALUES ( v_emp_ename || ' - ' || v_emp_sal );
COMMIT;
END IF;
EXCEPTION
WHEN exc_mas_de_uno THEN
INSERT INTO MESSAGES
VALUES ( 'Más de un Empleado con un salario de ' || v_emp
_sal );
COMMIT;
WHEN exc_ninguno THEN
INSERT INTO MESSAGES
VALUES ( 'Ningún empleado con un salario de ' || v_emp_sa
l );
COMMIT;
WHEN OTHERS THEN
INSERT INTO MESSAGES
VALUES ( 'Ocurrió algún otro error' );
COMMIT;
END;
/
/* SET SERVEROUTPUT OFF */
"
SQL> start p23q1.sql
Con el valor de salario: 800
Procedimiento PL/SQL terminado correctamente.
SQL> SELECT RESULTS
FROM MESSAGES;
RESULTS
-------
SMITH - 800
SQL> start p23q1.sql
Con el valor de salario: 3000
Procedimiento PL/SQL terminado correctamente.
SQL> SELECT RESULTS
FROM MESSAGES;
RESULTS
-------
SMITH - 800
Ocurrió algún otro error
[>>>MAL FUNCIONAMIENTO DE: p23q1.sql <<<]
SQL> start p23q1.sql
Con el valor de salario: 6000
Procedimiento PL/SQL terminado correctamente.
SQL> SELECT RESULTS
FROM MESSAGES;
RESULTS
-------
SMITH - 800
Ocurrió algún otro error
Ocurrió algún otro error
[>>>MAL FUNCIONAMIENTO DE: p23q1.sql <<<]
Respuesta del APÉNDICE A-79
---------------------------
SQL> TRUNCATE TABLE MESSAGES;
SQL> edit p23q1_v2.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p23q1_v2.sql
--------------------------------------------------------------------
"
SET VERIFY OFF
ACCEPT p_sal PROMPT 'Por favor ingrese un valor de salario: ';
DECLARE
v_ename EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE := &p_sal;
BEGIN
SELECT ENAME
INTO v_ename
FROM EMP
WHERE SAL = v_sal;
INSERT INTO MESSAGES ( RESULTS )
VALUES ( v_ename || ' - ' || v_sal );
EXCEPTION
WHEN no_data_found THEN
INSERT INTO MESSAGES ( RESULTS )
VALUES ( 'Ninguno con salario ' || v_sal );
WHEN too_many_rows THEN
INSERT INTO MESSAGES ( RESULTS )
VALUES ( 'Más de uno con salario ' || v_sal );
WHEN OTHERS THEN
INSERT INTO MESSAGES ( RESULTS )
VALUES ( 'Ocurrió algún otro error' );
END;
/
SET VERIFY ON
"
SQL> start p23q1_v2.sql
SQL> start p23q1_v2.sql
SQL> start p23q1_v2.sql
Ejercicio 2: Modifique el archivo de comandos p18q3.sql para añadirle un gestor
de excepciones.
a) Escriba un gestor de excepción para el error que pase un mensaj
e al usuario que diga que el departamento especificado no existe.
b) Ejecute el Bloque PL/SQL ingresando un número de departamento q
ue no existe.
"
Por favor ingrese el número de departamento: 50
Por favor ingrese la localización del departamento: HOUSTO
N
Procedimiento PL/SQL terminado correctamente.
G_MESSAGE
------------------------------------------
Departamento 50 es un departamento inválidado.
"
Respuesta 2)
------------
Contenido del archivo de comandos con el Bloque PL/SQL: p18q3.sql
-----------------------------------------------------------------
"
ACCEPT p_dept_deptno PROMPT 'Por favor ingrese el número del departame
nto: ';
ACCEPT p_dept_loc PROMPT 'Por favor ingrese la localidad del depa
rtamento: ';
DECLARE
v_dept_deptno DEPT.DEPTNO%TYPE;
v_dept_loc DEPT.LOC%TYPE;
BEGIN
v_dept_deptno := &p_dept_deptno;
v_dept_loc := '&p_dept_loc';
UPDATE DEPT
SET loc = v_dept_loc
WHERE deptno = v_dept_deptno;
COMMIT;
END;
/
"
SQL> edit p23q2.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p23q2.sql
-----------------------------------------------------------------
"
SET SERVEROUTPUT ON
ACCEPT p_dept_deptno PROMPT 'Por favor ingrese el número del departame
nto: ';
ACCEPT p_dept_loc PROMPT 'Por favor ingrese la localidad del depa
rtamento: ';
DECLARE
v_dept_deptno DEPT.DEPTNO%TYPE;
v_dept_loc DEPT.LOC%TYPE;
exc_dept_deptno_no_existe EXCEPTION; --Declaración de la Exc
epción
BEGIN
v_dept_deptno := &p_dept_deptno;
v_dept_loc := '&p_dept_loc';
UPDATE DEPT
SET loc = v_dept_loc
WHERE deptno = v_dept_deptno;
-- Si (función del CURSOR SQL IMPLÍCITO) la sentencia SQL Mas recien
te no afectó ningún registro-fila entonces provoca la gestión de la excepción
IF SQL%NOTFOUND THEN
RAISE exc_dept_deptno_no_existe;
END IF;
COMMIT;
EXCEPTION
--Gestion de la Excepción
WHEN exc_dept_deptno_no_existe THEN
DBMS_OUTPUT.PUT_LINE( 'El Departamento ' || v_dept_deptn
o || ' no es válido.' );
END;
/
SET SERVEROUTPUT OFF
"
SQL> start p23q2.sql
Con el número de departamento: 25
Procedimiento PL/SQL terminado correctamente
El Departamento 25 no es válido.
Ejercicio 3: Escribe un Bloque PL/SQL que imprima el número de empleados que ha
cen mas/menos $100 del valor de salario ingresado.
a) Si no hay empleados dentro de ese rango de salarios, imprima
un mensaje indicando al usuario cuál es el caso.
Use una excepción para este caso.
b) Si hay uno o mas empleados dentro de ese rango de salarios, e
l mensaje debería indicar cuántos empleados están comprendidos en ese rango de salario
s.
c) Trate cualquier otra excepción con un gestor de excepciones apr
opiado. El mensaje debería indicar que ocurrió algún otro error.
Respuesta 3)
------------
SQL> edit p23q3.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p23q3.sql
-----------------------------------------------------------------
"
SET SERVEROUTPUT ON
ACCEPT p_emp_sal PROMPT 'Por favor ingrese el salario: ';
DECLARE
v_emp_sal EMP.SAL%TYPE := &p_emp_sal;
v_cuenta NUMBER;
v_min EMP.SAL%TYPE := v_emp_sal - 100;
v_max EMP.SAL%TYPE := v_emp_sal + 100;
exc_ninguno EXCEPTION; --Declaración de la Excepción para e
l caso en que no hay empleados en ese rango de valores de salario
BEGIN
SELECT COUNT(*)
INTO v_cuenta
FROM EMP
WHERE SAL BETWEEN v_min AND v_max;
IF v_cuenta = 0 THEN
RAISE exc_ninguno; --Provoca la Excepción. Caso en qu
e no hay Empleados en ese rango de valores de salario
END IF;
DBMS_OUTPUT.PUT_LINE('Hay ' || v_cuenta || ' Empleados con salar
io entre ' || v_min || ' y ' || v_max);
EXCEPTION
WHEN exc_ninguno THEN --Gestiona la Excepción. Caso en q
ue no hay Empleados en ese rango de valores de salario
DBMS_OUTPUT.PUT_LINE('No hay Empleados con salario entre
' || v_min || ' y ' || v_max);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Ocurrió algún otro error');
END;
/
SET SERVEROUTPUT OFF
"
SQL> start p23q3.sql
Con el salario: 0
No hay Empleados con salario entre -100 y 100
Procedimiento PL/SQL terminado correctamente.
SQL> start p23q3.sql
Con el valor: 1100
Hay 1 Empleados con salario entre 1000 y 1200
Procedimiento PL/SQL terminado correctamente.
SQL> start p23q3.sql
Con el valor: 9000
No Hay Empleados con salario entre 8900 y 9100
Procedimiento PL/SQL terminado correctamente.
SQL> start p23q3.sql
Con el valor: lalala
Muestra una gran cantidad de mensajes de error.
El Procedimiento PL/SQL no termina.

You might also like