Anda di halaman 1dari 38

Universidad de Costa Rica

CI-2308 Bases de Datos II

PL/SQL

1
Introducción
Procedural Language extensions to the Structured
Query Language – PL/SQL
Lenguaje de programación que permite:
„ Manejo de variables
„ Estructura modular (procedimientos y funciones)
„ Estructuras de control
„ Manejo de excepciones
„ Una integración con el entorno Oracle.
Los programas creados con PL/SQL pueden ser
almacenados en la base de datos, lo cual facilita su
acceso.
Son la base para los disparadores de base de datos.

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-2


Ing. Luis Guillermo Zúñiga Mendoza

2
Características
Lenguaje altamente estructurado, leible y
accesible
Lenguaje estandar y portable para el
desarrollo Oracle
Lenguaje incrustado
Lenguaje de alto rendimiento y altamente
integrado con la base de datos

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-3


Ing. Luis Guillermo Zúñiga Mendoza

Lenguaje altamente estructurado, leible y accesible


Se encontrará que es un lenguaje fácil de aprender y con palabras clave sencillas y una estructura que
hace que se exprese claramente a la hora de interpretar el código. Por lo tanto es sencillo para
programadores novatos como experimentados.

Lenguaje estandar y portable para el desarrollo Oracle


Si ha escrito un procedimiento en PL/SQL en su notebook, en una base de datos OracleXe, fácilmente se
puede portar dicho código una base de datos corporativa y ejecutarlo sin realizarle cambio alguno (claro
está que sea una versión compatible). Su objetivo, antes incluso de que apareciera Java, fue “escríbalo
una vez, ejecútele en cualquier lado”.

Lenguaje incrustado
No se podrá ejecutar como una pieza de software separada, en este caso puede residir en el servidor y ser
invocado desde un cliente, o bien puede ser ejecutado por el cliente como parte de su código local.

Lenguaje de alto rendimiento y altamente integrado con la base de datos


En estos días puede utilizar una amplia variedad de lenguajes para acceder la base de datos, sin embargo
encontrará que es mucho más fácil desarrollar código eficiente que acceda la base de Oracle desde PL/SQL,
esto debido a que está diseñado específicamente para estas tareas.

3
Versiones de base datos Oracle y
correspondencia PL/SQL
Release Version Características
BD PL/SQL
6.0 1.0 Versión inicial de PL/SQL, usada principalmente en SQL*Plus (no permitía crear procedimientos
almacenados)
7.0 2.0 Agrega procedimientos almacenados, funciones y paquetes, registros definidos por el usuario,
tablas PL/SQL y varias extensiones de paquetes.
7.1 2.1 Soporta tipos definidos por usuario, permite el llamado de procedimientos almacenados dentro
de instrucciones SQL y ofrece SQL dinámico con el paquete DBMS_SQL. Esto permite ejecutar
comandos DDL dentro del programas PL/SQL.
7.3 2.3 Mejora funcionalidad de tablas PL/SQL, agrega capacidad de E/S con el paquete UTL_FILE,
completa la implementación de variables de cursor.
8.0 8.0 Cambia numeración para hacerla acorde a versión base de datos. Soporta orientación a objetos,
LOBs, colecciones (VARRAY y tablas anidadas) y Oracle/AQ (Oracle Advanced Queuing)
8.1 8.1 Primero de la serie Oracle i. Soporta Java, transacciones autónomas.
9.1 9.1 Primero que soporta herencia, colecciones multinivel y la instrucción CASE.
9.2 9.2 Agrega soporte a XML, soporta indexación de VARRAY con hileras además de enteros, mejora el
UTL_FILE.
10.1 10.1 Mejora el compilador y las advertencias en tiempo de compilación.
10.2 10.2 Permite una precompilación condicional para porciones de código, mediante variables booleanas
que el programador defina.

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-4


Ing. Luis Guillermo Zúñiga Mendoza

4
Estructura del Programa
Uso de Bloques
„ Anónimos
„ Nombrados
Š Procedimientos
Š Funciones
Partes del Bloque
„ Definición interfase PROCEDURE nombre
IS
„ Definición variables x number;
BEGIN
„ Instrucciones (código) ...
„ Recuperación por errores EXCEPTION
END;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-5


Ing. Luis Guillermo Zúñiga Mendoza

5
Bloques Anónimos
Este es el formato general que tienen los
bloques anónimos
[DECLARE
declaraciones]
BEGIN
instrucciones
[EXCEPTION
manejadores de excepción]
END;
Los “[” y “]” indican que son partes opcionales,
por lo que solo se utilizarán cuando sea
necesario.
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-6
Ing. Luis Guillermo Zúñiga Mendoza

Siempre vamos a encontrar que todo bloque tendrá un BEGIN y un END. En este caso el END lleva el “;”,
pues es el indicador de final de la instrucción. De hecho toda instrucción finaliza con “;”.

Declaraciones:
Son una o más líneas de código asociadas con identificadores definidos por el programador con tipos.

Instrucciones:
Una o más líneas de código que realizan una acción cuando el programa es ejecutado. Este es la única
parte requerida para un bloque PL/SQL.

Manejadores de excepción:
Una o más instrucciones que se ejecutarán cuando ciertas condiciones de error se den. Básicamente
define el comportamiento lógico del bloque que responde a presencia de errores. Si esta parte es omitida
el bloque responde finalizando el bloque prematuramente y devolviendo un mensaje de error.

6
Bloques Anidados
Los bloques pueden ser anidados uno dentro de
otros
BEGIN
...
BEGIN
...
EXCEPTION
...
END;
...
END;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-7


Ing. Luis Guillermo Zúñiga Mendoza

Dentro de un bloque podemos incluir otros bloques, incluso con la declaración de variables para los bloques
internos, las cuales pueden ser accededas desde este bloque pero no en el externo.

7
Ejemplo
DECLARE
v_num_empleados NUMBER(2);
BEGIN
INSERT INTO dept VALUES (99, 'PROVISIONAL', NULL);
UPDATE emp SET deptno = 99 WHERE deptno = 20;
-- se asigna el total de empleados cambiados de
-- departamento
v_num_empleados := SQL%ROWCOUNT;
DELETE FROM dept WHERE deptno = 20;
Dbms_output.put_line ( v_num_empleados ||
' empleados ubicados en PROVISIONAL.' );
EXCEPTION
WHEN OTHERS THEN
-- en cualquier error ejecutar ROLLBACK;
RAISE_APPLICATION_ERROR ( -20000,
'Error en la aplicación.' );
END;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-8


Ing. Luis Guillermo Zúñiga Mendoza

8
Bloques Nombrados
Procedimientos
„ PROCEDURE [schema.]name
[ ( parameter [, parameter ... ] ) ]
[AUTHID {DEFINER | CURRENT_USER}]
Funciones
„ FUNCTION [schema.]name
[ ( parameter [, parameter ... ] ) ]
RETURN return_datatype
[AUTHID {DEFINER | CURRENT_USER}]

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-9


Ing. Luis Guillermo Zúñiga Mendoza

Los bloques anónimos se utilizan como scripts que ejecutamos independientemente, para tareas especiales
y específicas. En el caso de los bloques nombrados, representa la mayor porción de código que
encontraremos en la base de datos.

Procedimientos:
Estos ejecutan instrucciones predefinidas y retornan el control a quien lo llamó. Luego de crear un
procedimiento se puede invocar por su nombre desde otros programas.

Funciones:
Son similares a los procedimientos, excepto que retornan un valor al programa que los llamó. El dato que
se retorna siempre será de un tipo específico predefinido.

9
Bloques nombrados
Ejemplo
CREATE OR REPLACE FUNCTION
calc_ship_charges
( in_merch_total IN NUMBER )
RETURN NUMBER IS
/* sección de declaración */
...
BEGIN
...
RETURN ( valor )
END;
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-10
Ing. Luis Guillermo Zúñiga Mendoza

10
Alcance (Scope)
Este tiene que ver con la posibilidad de acceso a
“cosas” referidas dentro de un programa.
Cuando un bloque declara excepciones,
variables o módulos, estos no pueden ser
accedidos fuera de este.
En el caso de PL/SQL los bloques anidados
pueden referenciar elementos del bloque
externo, pero no al contrario.
Uno de los casos más útiles se encuentra en el
manejo de excepciones.

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-11


Ing. Luis Guillermo Zúñiga Mendoza

11
Alcance (Scope)
Ejemplo
declare
x number;
y number;
begin
x := 10;
y := 5;
dbms_output.put_line ( 'x :' || x || ' y: ' || y );
declare
x number;
begin
x := 15;
dbms_output.put_line ( 'x :' || x || ' y: ' || y );
end;
end;

Salida
x :10 y: 5
x :15 y: 5

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-12


Ing. Luis Guillermo Zúñiga Mendoza

Acá podemos ver como se accede una variable desde el bloque interno (y) y como desde el mismo bloque
interno al crearse una variable con igual nombre a una de un bloque externo, se accede por defecto la del
bloque interno.

12
Alcance (Scope)
BEGIN
...
BEGIN /* bloque anidado */

INSERT INTO book_copies (isbn, qty)


VALUES (:newisbn, :copies);

EXCEPTION

WHEN DUP_VAL_ON_INDEX THEN


UPDATE book_copies SET qty = :copies
WHERE isbn = :newisbn;

END; /* bloque anidado */


books.distribute_inventory_report;
...
END;
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-13
Ing. Luis Guillermo Zúñiga Mendoza

En este ejemplo se puede ver que cuando el INSERT de error porque la copia del libro ya exista, entonces
el error es atrapado en la EXCEPTION del bloque interno, donde se hace una actualización de la cantidad
de copias. En el caso de que el error que de durante el INSERT sea distinto a la excepción contemplada el
programa retornará con error al usuario.

13
Conjunto de Caracteres
Algunos caracteres o combinaciones tienen un uso
especial en PL/SQL.
Caracter Descripción
; Punto y coma: termina declaraciones e instrucciones.
% Porcentaje: indicado (por ejemplo en cursores como %ISOPEN y
declaración indirecta de atributos como %ROWTYPE); también
utilizado como comodín con la condición LIKE.
_ Guión bajo (underscore): comodín simple con la condición LIKE.
@ Arroba: indicador de ubicación remota.
: Dos puntos: indicador de variable de ambiente, como :block.item
en Oracle Forms
** Doble asterisco: operador para exponenciación.
< > ó != ó ^= ó ~= Formas de denotar el operador relacional distinto.
|| Doble barra vertical: operador de concatenación.
<< y >> Delimitador de etiquetas
<= y >= Operadores Menor o igual y Mayor o igual
:= Operador de asignación
=> Operador de asociación para notación posicional.
.. Doble punto: operador de rango.
-- Doblo guión: indicador de comentario de línea sencilla.
/* y */ Delimitadores que inician y finalizan un bloque de comentarios.
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-14
Ing. Luis Guillermo Zúñiga Mendoza

14
Identificadores
Se usan identificadores para:
„ Constantes o variables
„ Excepciones
„ Cursores
„ Nombres de programas
„ Palabras reservadas
„ Etiquetas
Algunas reglas que hay que seguir a la hora de definir
identificadores
„ Pueden tener hasta 30 caracteres de largo
„ Deben iniciar con una letra
„ Pueden incluir el $, _ y #
„ No pueden contener espacios en blanco
„ No son sensibles a las mayúsculas y minúsculas

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-15


Ing. Luis Guillermo Zúñiga Mendoza

Algunos nombres de identificadores válidos son:


• Mi_casa#
• V_monto
• T299283
• Primer_Apellido
• PrimerApellido

En términos de PL/SQL, los siguientes identificadores son el mismo:


• Variable_local
• VARIABLE_local
• variable_Local

15
Palabras reservadas
Igual que en otros lenguajes, existen un
conjunto de palabras reservadas que no se
pueden usar dentro de código como
identificadores.
Por ejemplo
„ DELETE
„ IF
„ SQL
„ YEAR
„ TRUE
„ SYNONYM
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-16
Ing. Luis Guillermo Zúñiga Mendoza

16
Declaración de Variables
Formato
<variable> <tipo> [NOT NULL]
[{:=|DEFAULT} <valor>]
Ejemplos
„ DECLARE
mi_var VARCHAR2(10) := 'AMIGOS';
tu_var NUMBER(5,2) DEFAULT 5.32;
....

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-17


Ing. Luis Guillermo Zúñiga Mendoza

Como se puede ver existen dos formas para asignar valores por defecto, aun cuando no es necesario dar
valores por defecto a las variables declaradas.

17
Declaración de Variables
Cuando se declaran tipos se pueden
utilizar dos opciones para no dar tipos
explícitos
„ %ROWTYPE
Š Permite declarar variables tipo registro, con la
estructura de una tabla o bien de un cursor
„ %TYPE
Š Permite declarar variables con el tipo de datos de
una columna de tabla.

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-18


Ing. Luis Guillermo Zúñiga Mendoza

Un ejemplo del uso de estos tipos especiales son:

DECLARE
My_employee_id emp.empid%TYPE;
Rec_cliente customer%ROWTYPE;
BEGIN
...

DECLARE
My_sal emp.sal%TYPE := 0;
My_ename emp.ename%TYPE:= 'SMITH';
BEGIN ...

18
Declaración de Constantes
Formato
<constante> CONSTANT <tipo> [NOT NULL]
{:=|DEFAULT} <valor>
„ Similar a la declaración de variables solo que se
agrega CONSTANT y debe asignar el valor por
defecto siempre.
„ No pueden modificarse luego de su declaración.

Ejemplo
DECLARE
ano_actual CONSTANT NUMBER(4) :=
to_number(to_char(sysdate,’yyyy’));
pi CONSTANT NUMBER := 3.14159265358;
BEGIN
...
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-19
Ing. Luis Guillermo Zúñiga Mendoza

19
Estructuras de Control: IF
Para el IF tenemos las siguientes opciones:
1. IF <condición> THEN
Instrucciones;
END IF;
2. IF <condición> THEN
Instrucciones;
ELSE
Instrucciones;
END IF;
3. IF <condición> THEN
Instrucciones;
ELSIF <condición2> THEN
Instrucciones;
....
ELSE
Instrucciones;
END IF;
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-20
Ing. Luis Guillermo Zúñiga Mendoza

Debe tomar en cuenta que luego del THEN siempre debe ir al menos una instrucción. Cuando no tenga el
código (en etapa de pruebas o implementación) que va dentro del IF puede hacer el uso de instrucción
nula NULL y así evitar errores de sintaxis.

20
Estructuras de Control: CASE
Esta instrucción se incluye en el SQL 92, pero se incorpora al SQL
de Oracle en la versión 8i y a PL/SQL en versión 9i.
Hay dos formas para el CASE
„ Simple
CASE expresion
WHEN resultado1 THEN instrucciones1
WHEN resultado2 THEN instrucciones2
...
ELSE instrucciones_else
END CASE;
„ Búsqueda
CASE
WHEN expresion1 THEN instrucciones1
WHEN expresion2 THEN instrucciones2
...
ELSE instrucciones_else
END CASE;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-21


Ing. Luis Guillermo Zúñiga Mendoza

En el case Simple, se evalúa la expresión, una vez que se tiene su valor se compara (con la igualdad) a
cada uno de los resultados, cuando encuentra uno que es igual ejecuta las instrucciones asociadas, en caso
contrario ejecuta las instrucciones del ELSE. Nunca va a ejecutar dos opciones del CASE en la misma
ejecución, si hubiese dos con resultado idéntico ejecutará el primero.

En el case por Búsqueda, evalúa las expresiones booleanas, cuando encuentra una que retorne verdadero,
ejecuta las instrucciones asociadas.
La porción del ELSE es opcional. Cuando no se coloque un ELSE si luego de evaluar el CASE no se
encuentra una opción el sistema generá una opción ELSE automática de la siguiente forma:
ELSE
RAISE CASE_NOT_FOUND;
Lo cual provocará que el programa levante la excepción.

21
Estructuras de Control: CASE
Ejemplo 1
case job
when 'SALESMAN' then
incrementar_salario (0.10);
when 'CLERK' then
incrementar_salario (0.15);
else
incrementar_salario (0.05);
end case;
Ejemplo 2
case
when sal >= 1000 and sal <= 2000 then
incrementar_salario (0.10);
when sal > 2000 and sal <= 3500 then
incrementar_salario (0.15);
else
incrementar_salario (0.0);
end case;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-22


Ing. Luis Guillermo Zúñiga Mendoza

22
Ciclos: Loop
Este es el ciclo simple. Su sintáxis es:
LOOP
instrucciones:
END LOOP;

Para finalizar el ciclo es necesario


encontrar una instrucción de salida dentro
del mismo
„ EXIT;
„ EXIT WHEN condición;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-23


Ing. Luis Guillermo Zúñiga Mendoza

Nótese que con el EXIT se sale de inmediato y con el EXIT WHEN se sale hasta que la condición se vuelva
verdadera.

Un par de ejemplos con ambas formas de salir se presentan a continuación.

LOOP
i := i + 1;
IF i = 10 THEN
EXIT;
END IF;
END LOOP;

LOOP
i := i + 1;
EXIT WHEN i = 10;
END LOOP;

23
Ciclos: WHILE
Este es un ciclo que se continúa
ejecutando mientras la condición se
mantenga verdadera
Sintáxis
WHILE condición LOOP
instrucciones;
END LOOP;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-24


Ing. Luis Guillermo Zúñiga Mendoza

Este tipo de ciclos terminan cuando la condición se evalúa como FALSE o NULL, otra característica es que
puede que nunca se entre en el ciclo, situación que no sucede con el LOOP.

Un ejemplo sería

WHILE i < 10 LOOP


i := i + 1;
END LOOP;

24
Ciclos: FOR numérico
Permite realizar ciclos numéricos,
incrementando o decrementando una
variable.
Sintáxis
FOR indice IN [REVERSE] MIN number ..MAX number
LOOP
instrucciones
END LOOP;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-25


Ing. Luis Guillermo Zúñiga Mendoza

Define indice como una variable local al ciclo, la cual se incrementa iniciando en MIN y terminando en MAX.
Cuando se selecciona la opción REVERSE se inicia en MAX y termina en MIN. Véase que el incremento o
decremento es valores de una unidad.

Recuerde que el índice es local al ciclo y no puede ser accedido fuera de este.

Un ejemplo sería:

FOR i IN 1..10 LOOP


dbms_output.put_line ( i );
END LOOP;

25
Ciclos: FOR con Cursores
En esta caso el ciclo se asocia a un cursor
explícito.
Sintaxis
FOR indice_registro IN { nombre_cursor | (SELECT ...) }
LOOP
instrucciones;
END LOOP;

Ejemplo
FOR emp_rec IN ( select * from emp ) LOOP
dbms_output.put_line ( emp_rec.ename );
END LOOP;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-26


Ing. Luis Guillermo Zúñiga Mendoza

Este tipo de ciclos se utilizan cuando se necesitan procesar todos los registros de una consulta.

26
Cursores
Hay dos tipos
„ Implícitos
SELECT ename
INTO v_nombre
FROM emp
WHERE empno = 2993;
„ Explícitos
Š Sintaxis declaración
CURSOR nombre [([parametro[,parametro...])]
IS SELECT
[FOR UPDATE [OF [lista columnas]];

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-27


Ing. Luis Guillermo Zúñiga Mendoza

Los cursores implícitos son los que se crean como consecuencia de la ejecución de una instrucción INSERT,
UPDATE, DELETE o SELECT INTO. En este tipo de cursores la invocación de la instrucción se encarga de
abrir, extraer y cerrar el cursor. Véase que este tipo de instrucciones solo devuelven un registro.

En el caso de los cursores explícitos, uno debe declararlos, con la ventaja que puede controlar un poco más
su ejecución, en este caso podemos ir obteniendo uno a uno los valores, para cada registro del cursor.

En la declaración del cursor explícito podemos definirle parámetros a ser utilizados dentro del SELECT.
También se pueden incluir el FOR UPDATE con el objetivo de bloquear en forma de lectura los registros
devueltos por el SELECT.

27
Cursores: Control
Se tienen algunas instrucciones para manipular
el cursor
„ OPEN
„ FETCH .. INTO
„ CLOSE
Atributos del cursor
„ %FOUND
„ %NOTFOUND
„ %ISOPEN
„ %ROWCOUNT
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-28
Ing. Luis Guillermo Zúñiga Mendoza

Para manipular los datos del cursor, usted debe usar primero el comando OPEN seguido del nombre del
cursor. Posterior a esto debe utilizar el comando FETCH para extraer las filas del cursor, según el criterio
seguido por el select. Por último, una vez que ha sido procesado por completo, debe utilizarse el comando
CLOSE seguido del nombre del cursor, para esta forma terminar cualquier actividad asociada con el cursor
abierto.

El %NOTFOUND devuelve FALSE cuando es extraída una fila, TRUE si el último FETCH no extrajo fila
alguna y NULL si el SELECT del cursor no ha retornado datos.
El %FOUND es lógicamente opuesto al %FOUND en cuanto al TRUE y FALSE, pero sigue retornando NULL
si el cursor no ha retornado datos.
El %ROWCOUNT se utiliza para determinar cuantas filas han sido extraídas en un punto. Este valor se
incrementa con cada fila extraída y tiene valor cero cuando apenas ha sido abierto el cursor.
Por último, el %ISOPEN, tiene valores TRUE o FALSE, dependiendo de si el cursor asociado ha sido abierto
o no

28
Cursores: Ejemplo
declare
cursor cur_emp ( p_job in varchar2 ) is
select sum(sal) salario_total
from emp
where job = p_job;
--
rec_emp cur_emp%ROWTYPE;
begin
open cur_emp ( 'SALESMAN' );

fetch cur_emp INTO rec_emp;

dbms_output.put_line ( 'total para SALESMAN ' ||


to_char ( rec_emp.salario_total ));

close cur_emp;
end;
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-29
Ing. Luis Guillermo Zúñiga Mendoza

29
Manejo de Excepciones
Permite atrapar eventos de advertencia o error, para
encausar las salida correcta del programa.
Cuando se da una excepción se pasa el control a las
sección definida en el bloque PL/SQL
Definición de excepciones
„ Existe un conjunto definido en el paquete STANDARD
„ Pueden también ser definidas por el usuario
Š DECLARE
nombre_excepcion EXCEPTION;
Levantar una excepción
„ RAISE nombre_excepción;
„ RAISE_APPLICATION_ERROR
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-30
Ing. Luis Guillermo Zúñiga Mendoza

El control de excepciones es el mecanismo del PL/SQL para manejar errores de tiempo de ejecución. El
utilizar este mecanismo permite continuar la ejecución del programa, si el error no es muy grave, lo cual
quedaría a decisión del programador.
Usted debe definir el manejador de la excepción dentro de la especificación del programa o bloque.
Cuando un error de programa ocurre el control se pasa al bloque de manejo de excepciones, luego de lo
cual se regresa el control al que invoca al programa o bien termina según lo defina el programador.

El RAISE_APPLICATION_ERROR, se utiliza para levantar excepciones como un error ORACLE, de tal forma
que se retorne el control al procedimiento que invoca o a la sección de manejo de excepciones. Este
procedimiento recibe tres parámetros
• Num (number): acepta valores entre –20999 y –20000, es el número de error que podrá capturar la
aplicación que recibe el error. Los demás código no se utilizan pues son usados por Oracle para el
manejo de sus propios errores.
• Msg (varchar2): mensaje que se retorna explicando el error (variable de hasta 2k)
• Keeperrorstack (boolean): indica si el error se agrega a la pila de errores ya existente o si bien esta
se limpia. El valor por defecto es FALSE.

30
Manejo de Excepciones
Controlando las excepciones
„ Acá se utiliza la parte del bloque PL/SQL EXCEPTION, a través
del WHEN
WHEN excepción [OR excepción ] THEN
instrucciones;
Š O bien
WHEN OTHERS THEN
instrucciones;
Algunas funciones útiles son:
„ SQLERRM
„ SQLCODE
„ DBMS_UTILITY.FORMAT_ERROR_STACK
„ DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-31
Ing. Luis Guillermo Zúñiga Mendoza

Debe notarse que en un mismo bloque se pueden tener varias capturas de excepciones.
WHEN exception1 THEN
instrucciones
WHEN exception2 THEN
instrucciones

La función SQLERRM me da el mensaje de error devuelto por la excepción capturada.

La función SQLCOD me da el código de error de la excepción capturada.

DBMS_UTILITY.FORMAT_ERROR_STACK devuelve, al igual que SQLERRM, el texto del mensaje, pero


completo, debido a SQLERRM tiene un máximo de 512. Esta debería usarse en lugar del SQLERRM
preferiblemente.

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, devuelve el texto de la pila de errores, incluyendo las líneas


donde se dieron los errores originalmente.

31
Excepciones Predefinidas
Nombre Error Oracle
CURSOR_ALREADY_OPEN ORA-06511
DUP_VAL_ON_INDEX ORA-00001
INVALID_CURSOR ORA-01001
INVALID_NUMBER ORA-01722
LOGIN_DENIED ORA-01017
NO_DATA_FOUND ORA-01403
NOT_LOGGED_ON ORA-01012
PROGRAM_ERROR ORA-06501
STORAGE_ERROR ORA-06500
TIMEOUT_ON_RESOURCE ORA-00051
TOO_MANY_ROWS ORA-01422
TRANSACTION_BACKED_OUT ORA-00061
VALUE_ERROR ORA-06502
ZERO_DIVIDE ORA-01476

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-32


Ing. Luis Guillermo Zúñiga Mendoza

32
Manejo de Excepciones
DECLARE
v_empno emp.empno%TYPE;
BEGIN
...
SELECT e.empno
INTO v_empno
FROM emp e
WHERE e.ename = 'CHARLIE';
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line ( 'empleado no encontrado.' );
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line ( 'hay mas de un empleado con
ese nombre.' );
END;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-33


Ing. Luis Guillermo Zúñiga Mendoza

33
Manejo de Excepciones
CREATE OR REPLACE PROCEDURE proc1 IS SALIDA
BEGIN
DBMS_OUTPUT.put_line ('running proc1');
RAISE NO_DATA_FOUND; Proc3 -> Proc2 -> Proc1 backtrace
END; calling proc2
calling proc1
CREATE OR REPLACE PROCEDURE proc2 IS
l_str VARCHAR2 (30) := 'calling proc1'; running proc1
BEGIN Error stack at top level:
DBMS_OUTPUT.put_line (l_str); ORA-06512: at "SCOTT.PROC1", line 4
proc1;
END; ORA-06512: at "SCOTT.PROC2", line 5
ORA-06512: at "SCOTT.PROC3", line 4
CREATE OR REPLACE PROCEDURE proc3 IS
BEGIN
DBMS_OUTPUT.put_line ('calling proc2');
proc2;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line ('Error stack at top level:');
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
END;

SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.put_line ('Proc3 -> Proc2 -> Proc1 backtrace');
proc3;
END;
CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-34
Ing. Luis Guillermo Zúñiga Mendoza

Tomado de “Oracle PL/SQL Programming”

34
Paquetes
Hemos visto como los procedimientos y funciones nos pueden
ayudar a modularizar y por ende reutilizar código.
Tenemos una opción más, a la cual se le da el nombre de paquetes
Los paquetes de componen de dos partes:
„ Especificación
CREATE [OR REPLACE] PACKAGE <nombrepaquete> AS
<declaración de constantes, variables, cursores, excepciones y
otros objetos públicos>
<especificación de subprogramas>
END [<nombrepaquete>];
„ Cuerpo
CREATE [OR REPLACE] PACKAGE BODY <nombrepaquete> AS
<declaración de constantes, variables, cursores, excepciones y otros
objetos privados>
<cuerpo de subprogramas>
[BEGIN
<instrucciones de inicialización>;]
END [<nombrepaquete>];

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-35


Ing. Luis Guillermo Zúñiga Mendoza

35
Paquetes
CREATE PACKAGE emp_actions AS -- especificación
TYPE EmpRecTyp IS RECORD (
emp_id INTEGER,
salary REAL
);

CURSOR desc_salary RETURN EmpRecTyp;

PROCEDURE hire_employee (
ename VARCHAR2,
job VARCHAR2,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER
);

PROCEDURE fire_employee (
emp_id NUMBER
);

END emp_actions;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-36


Ing. Luis Guillermo Zúñiga Mendoza

36
Paquetes
CREATE PACKAGE BODY emp_actions AS -- cuerpo PROCEDURE fire_employee (
CURSOR desc_salary RETURN EmpRecTyp IS emp_id NUMBER
SELECT empno, sal ) IS
FROM emp BEGIN
ORDER BY sal DESC; DELETE FROM emp
WHERE empno = emp_id;
PROCEDURE hire_employee ( END fire_employee;
ename VARCHAR2,
job VARCHAR2, END emp_actions;
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER
) IS
BEGIN
INSERT INTO emp
VALUES
(empno_seq.NEXTVAL, ename, job,
mgr, SYSDATE, sal, comm, deptno);
END hire_employee;

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-37


Ing. Luis Guillermo Zúñiga Mendoza

37
Bibliografía
Steven Feuerstein, Bill Pribyl. Oracle SQL Programming.
O’Really. Agosto 2005.
Zúñiga, Luis. SQL y PL/SQL: Manejo y Uso. Notas del
Curso CI-2308. Enero 2007.
Manuales de Oracle.
Ramos Jesús, Ramos Alicia. Desarrollo de aplicaciones
en entornos de 4ta generación y herramientas Case.
Mc. Graw Hill, 2000.

CI-2308 Bases de Datos II Universidad de Costa Rica 11-1-38


Ing. Luis Guillermo Zúñiga Mendoza

38

Anda mungkin juga menyukai