2. PL/SQL (Procedural Language/SQL )
• PL/SQL es el lenguaje de programación que
PL/SQL es el lenguaje de programación que
proporciona Oracle para extender el SQL
estándar con otro tipo de estructuras e
estándar con otro tipo de estructuras e
instrucciones
1. Variables y tipos
st uctu as de co t o
2. Estructuras de control
• Bucles y sentencias IF‐THEN‐ELSE
3. Procedimientos y funciones
3 Procedimientos y funciones
4. Tipos de objetos y métodos
2
3. PL/SQL (Procedural Language/SQL )
• PL/SQL permite:
PL/SQL permite:
– Manipular los datos de la BD
– Manejar errores
Manejar errores
• Definidos por el usuario (excepciones)
• Propios del sistema (predefinidos)
Propios del sistema (predefinidos)
• La unidad básica de cualquier programa
La unidad básica de cualquier programa
PL/SQL es el bloque
• C d bl
Cada bloque realiza una unidad lógica de
li id d ló i d
trabajo en el programa, separando así unas
tareas de otras
d
3
4. PL/SQL (Procedural Language/SQL )
• Estructura básica de un bloque:
Estructura básica de un bloque:
DECLARE
/* Declaración de uso local: variables, cursores,
excepciones de usuario, …*/
BEGIN
/* Sección ejecutable (obligatoria): órdenes SQL y
procedimentales */
EXCEPTION
/* Zona de control de errores */
END;
END
4
5. PL/SQL ‐ Declaración de variables
• Sección de Declaración de Variables
Sección de Declaración de Variables
– Contiene la declaración de:
• tipos de datos,
i d d
• las constantes
• variables
– También se declaran cursores y excepciones
definidas por el usuario.
– Las variables externas se declaran en SQL*Plus y
se escriben precedidas de ‘:’.
5
6. PL/SQL ‐ Declaración de variables
• Sintaxis
nombre_variable
nombre variable [CONSTANT] tipo
[NOT NULL]
[:= valor_inicial];
[ l i i i l]
• La cláusula CONSTANT indica la definición de una
lá l i di l d fi i ió d
constante que debe ser inicializada y cuyo valor no
puede ser modificado
d difi d
• [NOT NULL]: Obliga a tener valor
6
7. PL/SQL ‐ Declaración de variables
• Sintaxis
nombre_variable [CONSTANT] tipo
[NOT NULL]
[:= valor_inicial];
• Tipo: puede ser:
– Tipo de datos: tipo de dato de la variable
Tipo de datos: tipo de dato de la variable
– Identificador%TYPE → Se refiere al tipo usado por una
columna de la tabla
columna de la tabla
– Identificador%ROWTYPE → Es una fila variable con los
mismos nombres y tipos que las columnas de una tabla o
mismos nombres y tipos que las columnas de una tabla o
fila recuperada de un cursor
7
8. PL/SQL ‐ Declaración de variables
• Variables y constantes. Ejemplo
Variables y constantes. Ejemplo
DECLARE
v_DNI NUMBER (8,0);
v_Nombre VARCHAR (30);
( );
c_Factor CONSTANT NUMBER(3,2):=0.10;
v_DNI2
v DNI2 cliente.DNI%TYPE;
cliente DNI%TYPE;
v_precio NUMBER:= 300;
cur_Rcliente
R li t cliente%ROWTYPE;
li t %ROWTYPE
8
9. PL/SQL ‐ Declaración de variables
• CURSORES
– Cursor es un área de trabajo definida para las
consultas que devuelven más de una fila.
– Permite la manipulación de datos
p
– Se le pueden pasar parámetros
• Tipos de cursores
– Cursor simple
– Cursores con paso de parámetros
p p
– Cursores con actualización 9
10. PL/SQL ‐ Declaración de variables
• CURSOR simple. Sintaxis
CURSOR simple. Sintaxis
CURSOR nombre cursor IS
sentencia_SELECT;
• Ejemplo
DECLARE
….
CURSOR c_cliente IS
SELECT cliente.DNI, cliente.nombre
SELECT cliente DNI cliente nombre
FROM cliente
WHERE cliente.tipo_trabajo= jefe ;
WHERE cliente tipo trabajo=´jefe´;
10
11. PL/SQL ‐ Declaración de variables
• CURSORES CON PASO DE PARÁMETROS. Sintaxis
CURSORES CON PASO DE PARÁMETROS. Sintaxis
CURSOR nombre cursor [PARAMETROS] IS
sentencia_SELECT;
• Los parámetros de un cursor se pueden utilizar para
Los parámetros de un cursor se pueden utilizar para
definir variables con valores de entrada.
• La consulta SQL asociada se ejecuta utilizando esos
La consulta SQL asociada se ejecuta utilizando esos
valores
• PARAMETROS
PARAMETROS ‐>
(nombre_parametro tipo_parametro, …)
11
12. PL/SQL ‐ Declaración de variables
• CURSORES CON PASO DE PARÁMETROS. Sintaxis
CURSORES CON PASO DE PARÁMETROS. Sintaxis
CURSOR nombre cursor [PARAMETROS] IS
sentencia_SELECT;
• EJEMPLO:
CURSOR cur_cliente (v_provincia cliente.provincia%TYPE) IS
SELECT dni, nombre
SELECT dni nombre
FROM clientes
WHERE clientes.provincia= v_provincia;
WHERE clientes provincia= v provincia;
12
13. PL/SQL ‐ Declaración de variables
• CURSORES CON ACTUALIZACIÓN. Sintaxis
CURSORES CON ACTUALIZACIÓN. Sintaxis
CURSOR nombre cursor IS
sentencia_SELECT
FOR UPDATE [OF nombre columna]
[ ]
• S d j
Se dejan preparados para modificar las filas
d difi l fil
devueltas y se generan bloqueos exclusivos sobre
las filas activas
l fil ti
13
14. PL/SQL ‐ Declaración de variables
• CURSORES CON ACTUALIZACIÓN. Sintaxis
CURSORES CON ACTUALIZACIÓN. Sintaxis
CURSOR nombre cursor IS
sentencia_SELECT
FOR UPDATE [OF nombre columna]
[ ]
• EJEMPLO:
CURSOR cur_cliente IS
l
SELECT DNI, nombre
FROM cliente
WHERE tipo_trabajo=´jefe´
FOR UPDATE OF salario;
14
15. PL/SQL ‐ Declaración de variables
• OPERACIONES CON CURSORES
OPERACIONES CON CURSORES
– OPEN: abre los cursores
– FETCH l l d t
FETCH : lee los datos
– CLOSE: cierra los cursores
• Pasos:
1.‐ Declarar el cursor
2.‐ Abrir el cursor en la zona de procedimiento
3.‐ Leer el cursor. Es necesario ejecutar un bucle para leer
j p
todos los cursores
4.‐ Cerrar el cursor
15
16. PL/SQL ‐ Declaración de variables
• ATRIBUTOS DE LOS CURSORES
ATRIBUTOS DE LOS CURSORES
– Se le añaden al nombre del cursor
%NOTFOUND → Se usa para detectar el final de
un cursor. Devuelve TRUE si la ultima lectura
un cursor. Devuelve TRUE si la ultima lectura
falla porque no hay filas disponibles y FALSE si
recupera
%FOUND → El contrario de %NOTFOUND
%ROWCOUNT → Devuelve el número de fila leída
%ROWCOUNT D l l ú d fil l íd
%ISOPEN → Devuelve TRUE si el cursor esta
abierto y FALSE si no lo está
16
17. PL/SQL – Declaración de variables
• Ejemplo uso cursor
Ejemplo uso cursor
DECLARE
CURSOR cur_emp IS SELECT DNI, nombre FROM
empleado;
emp registro cur emp%ROWTYPE;
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp INTO emp_registro;
EXIT WHEN cur emp%NOTFOUND;
%NOTFOUND
...
END LOOP;
CLOSE cur_emp;
17
END;
18. PL/SQL ‐ Declaración de variables
• EXCEPCIONES
– Excepciones predefinidas en PL/SQL que
informan de los errores producidos en la
ejecución de las sentencias SQL por parte del
sistema de gestión de bases de datos.
– Además de éstas, el programador puede definir
, p g p
excepciones de uso específico.
– Controlan los errores de ejecución de un
Controlan los errores de ejecución de un
programa, previstos por el programador
– El control de las excepciones de usuario es
El control de las excepciones de usuario es
enteramente gestionado por él. 18
19. PL/SQL ‐ Declaración de variables
• EXCEPCIONES. Sintaxis
EXCEPCIONES. Sintaxis
nombre_excepción EXCEPTION;
– Cada excepción trata un error
– No son variables y no se las puede tratar como
No son variables y no se las puede tratar como
tal
– No pueden utilizarse como argumentos en
No pueden utilizarse como argumentos en
funciones ni en procedimientos
–SSe activan mediante la sentencia RAISE
ti di t l t i RAISE
RAISE nombre_excepción;
19
20. PL/SQL – Sección de excepciones
• Ejemplo
DECLARE
e_hay_emp
e hay emp EXCEPTION;
v_dep departamento.depnum%TYPE := 10;
BEGIN
IF (SELECT COUNT(*) FROM empleados WHERE depnum = v_dep)=0
THEN RAISE e_dep_vacio;
ELSE … END IF;
ELSE END IF;
…
END;
20
21. PL/SQL – Tipos de datos estructurados
• Entre los tipos de datos estructurados que
Entre los tipos de datos estructurados que
proporciona PL/SQL están:
– los registros (RECORD)
g ( )
– los vectores (TABLE y VARRAY).
• Se declaran en la sección DECLARE
21
22. PL/SQL – Tipos de datos estructurados
• REGISTROS – Sintaxis
REGISTROS Sintaxis
TYPE nombre_tipo IS RECORD
(campo tipo[, campo tipo] ...);
– Ejemplo:
TYPE tipo_empleado_reg IS RECORD
( nombre VARCHAR2(10),
( ),
puesto VARCHAR2(8),
sueldo NUMBER(6)
( )
);
22
23. PL/SQL – Tipos de datos estructurados
• REGISTROS – creación de variables
REGISTROS creación de variables
Nombre_variable tipo_reg;
– Ejemplo:
v_empleado_reg tipo_empleado_reg;
• Referenciar las variables
Nombre_variable.campo:=valor
23
24. PL/SQL – Tipos de datos estructurados
• VECTORES Y TABLAS – Sintaxis
VECTORES Y TABLAS
TYPE nombre_tipo IS VARRAY (tamaño_max)
OF tipo_datos [NOT NULL];
TYPE nombre_tipo IS TABLE
OF tipo_datos [NOT NULL];
– La tabla puede crecer ilimitadamente
– El vector solo puede crecer hasta el tamaño
El vector solo puede crecer hasta el tamaño
máximo definido 24
25. PL/SQL – Tipos de datos estructurados
• VECTORES
TYPE nombre_tipo IS VARRAY (tamaño_max)
OF tipo_datos [NOT NULL];
– Para poder utilizar los vectores, deben ser
previamente creados vacíos o con elementos.
– Para insertar elementos adicionales se tienen que
Para insertar elementos adicionales se tienen que
extender mediante la cláusula EXTEND
– En los vectores no se pueden borrar elementos
En los vectores no se pueden borrar elementos
25
26. PL/SQL – Tipos de datos estructurados
• VECTORES
– Ejemplo:
DECLARE
TYPE t_varray IS VARRAY (50) OF empleado.nombre%TYPE;
v_varray t_varray;
v varray t varray;
BEGIN
...
v_varray := t_varray(‘Ana’, ‘Lola’);‐‐ se crea con dos elementos
v_varray.EXTEND;
v_varray(3) := ‘Luis’;
v varray(3) ‘Luis’
v_varray.EXTEND;
v_varray(4) := ‘Juan’;
y( ) ;
....
26
END;
27. PL/SQL – Tipos de datos estructurados
• TABLAS
TABLAS
TYPE nombre_tipo IS TABLE
OF tipo datos [NOT NULL]
tipo_datos NULL];
– En los tipo TABLE se pueden borrar elementos con
la instrucción DELETE, pudiendo quedar huecos
intermedios vacíos
– Se pueden volver a llenar con una asignación. La
función EXISTS nos permite saber si un elemento
se puede referenciar o ha sido borrado
27
28. PL/SQL – Tipos de datos estructurados
• TABLAS – Ejemplo
TABLAS
DECLARE
TYPE t_table IS TABLE OF empleado.nombre%TYPE;
p ;
v_table t_table;
BEGIN
v_table := t_table(‘Ana’, ‘Lola’);
v_table(2) := NULL; ‐‐Dejar una posición vacía
v_table1.DELETE(1);‐‐Así es como se borra una posición
v table1 DELETE(1); Así es como se borra una posición
v_table1.EXTEND;
v_table1(3) := ‘Luis’;
( ) ;
IF v_table1(1).EXISTS
THEN ...;
ELSE v_table1(1) := ‘Pepe’; END IF;
END; 28
29. PL/SQL – Tipos de datos estructurados
• VECTORES Y TABLAS – Métodos predefinidos
VECTORES Y TABLAS Métodos predefinidos
– COUNT → Devuelve el número de filas de la tabla
– DELETE (nº) → Borra las filas de una tabla
DELETE (nº) → Borra las filas de una tabla
– EXITS (nº) → Devuelve TRUE si existe en la tabla la fila
especificada
– FIRST → Devuelve el índice de la primera fila
– LAST → Devuelve el índice de la última fila
LAST → Devuelve el índice de la última fila
– NEXT → Devuelve el índice de la fila de la tabla que sigue a
la fila especificada
la fila especificada
– PRIOR → Devuelve el índice de la fila de la tabla que
p
precede a la fila especificada
p
29
30. PL/SQL – Sección Ejecutable
• Sección Ejecutable
Sección Ejecutable
– Tres clases de instrucciones
• Instrucciones de asignación
g
• Instrucciones de control de flujo
• Bucles
– Instrucciones no permitidas son:
DROP, CREATE, ALTER, …
DROP CREATE ALTER
30
31. PL/SQL – Sección Ejecutable
• Instrucciones de asignación
Instrucciones de asignación
variable := expresión;
p ;
• Expresiones
Expresiones:
– Pueden incluir literales, variables y constantes
definidas en el bloque
– También funciones aplicadas sobre literales,
constantes y variables.
31
32. PL/SQL – Sección Ejecutable
• Instrucciones de asignación‐ Asignación de
Instrucciones de asignación Asignación de
sentencias SQL
– Es posible realizar la asignación del resultado de
una SELECT a una lista de variables o a un cursor.
– Si se asigna a una lista de variables, la consulta
asociada sólo debe dar como resultado una única
asociada sólo debe dar como resultado una única
fila (en caso contrario se genera una excepción)
– Cuando no se conoce a priori el número de filas
Cuando no se conoce a priori el número de filas
del resultado, resulta más conveniente utilizar
cursores.
cursores
32
33. PL/SQL – Sección Ejecutable
• Literales:
– Las cadenas de caracteres se delimitan por la
comilla simple.
comilla simple
– Los números reales pueden especificarse tanto
en formato decimal como científico
– Operadores sobre Números: +, ‐, *, /, **, MOD
– Operadores sobre cadenas: || (concatenación)
Operadores sobre cadenas: || (concatenación).
– Operadores lógicos: AND, OR, NOT.
33
35. PL/SQL – Sección Ejecutable
• Funciones:
– Funciones sobre cadenas de caracteres:
ASCII, CHR, LENGTH, LOWER, SUBSTR, UPPER, …
ASCII CHR LENGTH LOWER SUBSTR UPPER
– Funciones numéricas: ABS, FLOOR, MOD,ROUND, SQRT,
TRUNC, …
TRUNC
– Funciones sobre fechas: ADD_MONTHS, LAST_DAY,
MONTHS_BETWEEN, NEXT_DAY, SYSDATE, TRUNC.
MONTHS BETWEEN, NEXT DAY, SYSDATE, TRUNC.
– Funciones de conversión: TO_CHAR, TO_DATE,
TO_NUMBER.
_
– Funciones de control de errores: SQLCODE, SQLERRM
–…
35
36. PL/SQL – Sentencias de Control de flujo
• Sentencias de Control de flujo
Sentencias de Control de flujo
– Realizan el control del comportamiento del
bloque.
bloque
– Tipos:
• Condicionales (IF)
• Bucles
–Los bucles permiten repetir un número de
veces un conjunto de instrucciones
veces un conjunto de instrucciones
PL/SQL.
Para romper el bucle se usa EXIT GOTO o
–Para romper el bucle se usa EXIT, GOTO o
RAISE 36
37. PL/SQL – Sentencias de Control de flujo
• CONDICIONALES (IF)
CONDICIONALES (IF)
– Ejecuta una o varias sentencias dependiendo de
una condición
una condición
IF condición THEN instrucciones;
[ELSIF condición THEN instrucciones]
[ELSE instrucciones];
……
EN DIF
37
38. PL/SQL – Sentencias de Control de flujo
• BUCLES
– Bucles simples (LOOP).
– Bucles condicionales (WHILE)
– Bucles numéricos (FOR)
– Bucles sobre cursores
– Bucles sobre sentencias SELECT
Bucles sobre sentencias SELECT
38
39. PL/SQL – Sentencias de Control de flujo
• BUCLES SIMPLES (LOOP) – Sintaxis
BUCLES SIMPLES (LOOP)
[nombre_bucle] LOOP sentencias;
END LOOP
LOOP;
• Ejemplo
DECLARE
v_contador BINARY_INTEGER:=1;
BEGIN
LOOP
INSERT INTO tabla_temporal
VALUES ( contador,’ejemplo’);
S (v d j l )
v_contador:=v_contador+1;
EXIT WHEN v_contador>50;
END LOOP;
END; 39
40. PL/SQL – Sentencias de Control de flujo
• BUCLES CONDICIONALES (WHILE)
CONDICIONALES (WHILE)
– La condición se evalúa antes de entrar en el
bucle
[nombre_bucle] WHILE condición
LOOP
sentencias;
END LOOP;
40
41. PL/SQL – Sentencias de Control de flujo
• BUCLES CONDICIONALES (WHILE)
CONDICIONALES (WHILE)
– Ejemplo
DECLARE
v_contador BINARY_INTEGER:=1;
BEGIN
WHILE v_contador<=50 LOOP
INSERT INTO tabla_temporal
VALUES (v_contador,’ejemplo’);
v_contador:=v_contador+1;
END LOOP;
END;
41
42. PL/SQL – Sentencias de Control de flujo
• BUCLES NUMÉRICOS (FOR)
BUCLES NUMÉRICOS (FOR)
– Se ejecutan una sola vez por cada elemento de
rango definido
rango definido
[nombre_bucle] FOR indice IN [REVERSE]
exp n1 e p
e p n1..exp n2 LOOP
sentencias;
END LOOP;
LOOP
– indice: variable numérica de control empieza en
exp_n1 y termina en exp_n2 .
1 i 2
– Se declara implícitamente como un
BINARY_INTEGER
42
43. PL/SQL – Sentencias de Control de flujo
• BUCLES NUMÉRICOS (FOR)
BUCLES NUMÉRICOS (FOR)
– Se ejecutan una sola vez por cada elemento de
rango definido
rango definido
[nombre_bucle] FOR indice IN
[REVERSE] e p n1 e p n2 LOOP
exp n1..exp
sentencias;
END LOOP;
LOOP
–[ V S ] L
[REVERSE]: La cuenta se hace al revés
h l é
– Exp_n1, y exp_n2 pueden ser ctes o cualquier
expresión que devuelva un número
43
44. PL/SQL – Sentencias de Control de flujo
• BUCLES NUMÉRICOS (FOR)
BUCLES NUMÉRICOS (FOR)
– Ejemplo
BEGIN
FOR v_contador IN 1..50 LOOP
INSERT INTO tabla_temporal
VALUES (v_contador,’ejemplo’);
END LOOP;
END;
44
45. PL/SQL – Sentencias de Control de flujo
• BUCLES SOBRE CURSORES
BUCLES SOBRE CURSORES
– En un bucle sobre cursores se declara de modo
implícito la variable fila asociada.
– Asimismo, se realiza un OPEN del cursor al entrar
en el bucle y un CLOSE al salir
y
– Se produce un FETCH implícito en cada iteración
del bucle.
del bucle
45
46. PL/SQL – Sentencias de Control de flujo
• BUCLES SOBRE CURSORES
BUCLES SOBRE CURSORES
– Ejemplo:
DECLARE
CURSOR cur_emp IS
SELECT num_empleado, nomb_empleado FROM
empleado;
BEGIN
FOR emp_registro IN cur_emp LOOP
IF emp_registro.edad>30 THEN ...
IF it d d 30 THEN
END LOOP;
END;
46
47. PL/SQL – Sentencias de Control de flujo
• BUCLES SOBRE SENTENCIAS SELECT
BUCLES SOBRE SENTENCIAS SELECT
– Es el mismo concepto anterior pero sin
declaración de cursores
declaración de cursores
[nombre_bucle]
[nombre bucle]
FOR nombre_registro IN (sentencia_select)
LOOP sentencias
LOOP t i
END LOOP;
– Cuando se sale con exit o error del bucle el
cursor interno que genera ORACLE se cierra
cursor interno que genera ORACLE se cierra
47
48. PL/SQL – Sentencias de Control de flujo
• BUCLES SOBRE SENTENCIAS SELECT
BUCLES SOBRE SENTENCIAS SELECT
– Ejemplo
BEGIN
FOR registro IN (SELECT DNI, nombre FROM cliente)
g ( , )
LOOP
INSERT INTO tabla_temporal
p
(contador, texto)
VALUES (registro.DNI, registro.nombre);
VALUES (registro.DNI, registro.nombre);
END LOOP;
END;
48
49. PL/SQL – Sentencias de Control de flujo
• GOTO y ETIQUETAS
GOTO y ETIQUETAS
– transfiere el control a la sentencia o bloque
siguiente a la etiqueta indicada
siguiente a la etiqueta indicada
<<etiqueta>>
GOTO <<etiqueta>>;
– La sentencia puede ir a otro bloque o sub‐bloque
pero nunca a la zona de excepciones.
– La sentencia siguiente a la etiqueta debe ser un
ejecutable.
– No se puede realizar saltos al interior de un IF o
No se puede realizar saltos al interior de un IF o
de un bucle. 49
50. PL/SQL – Sección de excepciones
• Manejo de excepciones
Manejo de excepciones
– Permite responder ante cualquier problema que
Permite responder ante cualquier problema que
pueda ocurrir en la ejecución de cualquier
operación
– La ejecución de la aplicación finaliza al
presentarse algún error grave
t l ú
– Mediante el manejo de excepciones es posible
realizar una serie de acciones y continuar la
ejecución de la aplicación.
50
51. PL/SQL – Sección de excepciones
• Manejo de excepciones
Manejo de excepciones
WHEN excepciones THEN instrucciones;
– Donde excepciones:
excep_múltiples | OTHERS
– Donde excep múltiples:
Donde excep_múltiples:
excepción | excepción OR excep_múltiples
51
52. PL/SQL – Sección de excepciones
• Manejo de excepciones
Manejo de excepciones
– La activación de una excepción la realiza el
La activación de una excepción la realiza el
sistema o el programa mediante utilización de la
sentencia RAISE
sentencia RAISE
– Cuando una excepción se activa, la ejecución
continúa en la parte de manejadores de
ti ú l t d j d d
excepciones
– Si no existe la excepción activada en la sección de
excepciones, la excepción sigue activa por si
tuviera que ser tratada en otro nivel.
52
53. PL/SQL – Sección de excepciones
• En la parte de manejadores la ejecución se
En la parte de manejadores, la ejecución se
realiza del modo siguiente:
–S b
Se busca un manejador que corresponda con la excepción
j d d l ió
activada,
– La cláusula OTHERS corresponde a todas las excepciones
La cláusula OTHERS corresponde a todas las excepciones
– Es conveniente poner la cláusula OTHERS la última
– Una vez encontrado el manejador se desactiva la
Una vez encontrado el manejador, se desactiva la
excepción y se ejecutan las instrucciones asociadas
– Si se deseara mantener activa la excepción o se desea
Si se deseara mantener activa la excepción, o se desea
activar cualquier otra, es posible incluir la sentencia RAISE
q
que finalizaría el bloque y activaría la excepción asociada.
q y p
53
54. PL/SQL – Sección de excepciones
• Excepciones predefinidas por Oracle:
Excepciones predefinidas por Oracle:
,
– NO_DATA_FOUND TOO_MANY_ROWS →
Ocurren cuando un select no selecciona nada o
selecciona varias filas cuando sólo se esperaba una
– INVALID_NUMBER, VALUE_ERROR, ZERO_DIVIDE →
Se producen por operaciones invalidas de tratamiento de
S d i i lid d t t i t d
números
– DUP VAL ON INDEX →
DUP_VAL_ON_INDEX →
Se produce cuando se intenta insertar una clave primaria
duplicada.
duplicada
54
55. PL/SQL – Sección de excepciones
• Excepciones predefinidas por Oracle:
Excepciones predefinidas por Oracle:
– CURSOR_ALREADY_OPEN →
Ocurre al intentar abrir un cursor ya abierto
– INVALID_CURSOR →
Ocurre al intentar hacer una operación invalida sobre un cursor
– PROGRAM_ERROR, STORAGE_ERROR,
TIMEOUT ON RESOURCE →
TIMEOUT_ON_RESOURCE →
Detectan errores de almacenamiento o de ejecución.
55
56. PL/SQL – Sección de excepciones
• Manejo de excepciones – Ejemplo
Manejo de excepciones
DECLARE
e_hay_emp
e hay emp EXCEPTION;
v_dep departamento.depnum%TYPE := 10;
BEGIN
IF (SELECT COUNT(*) FROM empleados WHERE depnum = v_dep)=0
THEN RAISE e_dep_vacio;
ELSE … END IF;
ELSE END IF;
EXCEPTION
WHEN e_dep_vacio THEN RAISE_APPLICATION_ERROR( 20001, El
WHEN e dep vacio THEN RAISE APPLICATION ERROR(‐20001, ‘El
dep. TO_CHAR(v_dep) no tiene empleados .’);
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(‘abortado por
error desconocido’);
d id ’)
END; 56