Академический Документы
Профессиональный Документы
Культура Документы
DMR Consulting
Febrero, 2005
Paquetes, Procedimientos y
funciones PL/SQL
1 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
2 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
3 Qualitas
Sistemas de Información
1 Introducción
Requisitos Previos
Conocimientos del lenguaje SQL
Conocimientos en programación estructurada y en gestores de base de
datos relacionales
Paquetes, Procedimientos y
funciones PL/SQL
4 Qualitas
Sistemas de Información
1 Introducción
Visión Global
PL/SQL (Procedural Language/SQL) es el lenguaje procedural de
Oracle Corporation. Se trata de una extensión de SQL con las
características típicas de los lenguajes de programación.
- Variables
- Estructuras de control
- Funciones
Paquetes, Procedimientos y
funciones PL/SQL
5 Qualitas
Sistemas de Información
1 Introducción: Estructura(I)
Bloque tipo
• DECLARE – Opcional
- Variables, cursores, excepciones
definidas por el usuario.
• BEGIN – Obligatorio
- Sentencias SQL.
- Sentencias de Control PL/SQL.
• EXCEPTION – Opcional
-Begin
- Acciones a realizar en caso de
error.
- End;
• END; - Obligatorio
Paquetes, Procedimientos y
funciones PL/SQL
6 Qualitas
Sistemas de Información
1 Introducción: Estructura(II)
Paquetes, Procedimientos y
funciones PL/SQL
7 Qualitas
Sistemas de Información
1 Introducción: Tipos de Bloques
Bloques Anónimos
Son bloques sin nombrar. Se suelen construir de manera dinámica,
y se ejecutan una sola vez.
Bloques nominados
Iguales que los anónimos, con etiqueta que le da al bloque un
nombre.
Subprogramas
Son bloques PL/SQL especificados, almacenados en el servidor
Oracle, que pueden tomar parámetros y pueden ser invocados. Se
declaran como Procedimientos o Funciones.
Generalmente se utiliza un procedimiento para ejecutar una acción
y una función para calcular un valor. En general son similares,
salvo en que la función debe devolver un valor.
Paquetes, Procedimientos y
funciones PL/SQL
8 Qualitas
Sistemas de Información
1 Introducción: Tipos de Bloques
Paquetes, Procedimientos y
funciones PL/SQL
9 Qualitas
Sistemas de Información
1 Introducción: Sintaxis de un Bloque PL/SQL
DECLARE
db_nombre VARCHAR2(25)
-- Comentario de 1 línea
BEGIN
SELECT nombre
INTO db_nombre
FROM alumnos
/* Comentario de
varias líneas */
END;
Paquetes, Procedimientos y
funciones PL/SQL
10 Qualitas
Sistemas de Información
1 Introducción: Restricciones
Paquetes, Procedimientos y
funciones PL/SQL
11 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
12 Qualitas
Sistemas de Información
2 Variables
Paquetes, Procedimientos y
funciones PL/SQL
13 Qualitas
Sistemas de Información
2 Variables: Gestión de Variables
Paquetes, Procedimientos y
funciones PL/SQL
14 Qualitas
Sistemas de Información
2 Variables: Sintaxis
Sintaxis
Paquetes, Procedimientos y
funciones PL/SQL
15 Qualitas
Sistemas de Información
2 Variables: Tipos de Variables (I)
Paquetes, Procedimientos y
funciones PL/SQL
16 Qualitas
Sistemas de Información
2 Variables: Tipos de Variables (II)
Atributo %TYPE
Cuando las variables PL/SQL son utilizadas para manipular datos
almacenados en una tabla de la base de datos, es recomendable
hacer uso del atributo %TYPE, para evitar modificaciones en el
código si la definición del tipo de dato de la columna de la tabla a
la que la variable hace referencia cambia.
Ejemplo: db_nombre alumnos.nombre%TYPE
Paquetes, Procedimientos y
funciones PL/SQL
17 Qualitas
Sistemas de Información
2 Variables: Tipos de Variables (III)
Recomendación
Usar el tipo de datos REGISTRO para tratar una colección de
campos como una unidad lógica. Los registros PL/SQL son
adecuados para recuperar una fila de datos de una tabla para su
procesamiento.
Atributo %ROWTYPE
Permite definir un registro en PL/SQL con los mismos tipos que
una fila de una tabla de la base de datos.
Ejemplo: DECLARE
var_ejemplo nombre_tabla%ROWTYPE
Paquetes, Procedimientos y
funciones PL/SQL
18 Qualitas
Sistemas de Información
2 Tipos de Datos Compuestos: Registros
DECLARE
alumnos_record alumnos%ROWTYPE
Paquetes, Procedimientos y
funciones PL/SQL
19 Qualitas
Sistemas de Información
2 Tipos de Datos Compuestos: Registros
SINTAXIS
DECLARE
....
TYPE alumnos_record IS RECORD
(nombre ALUMNOS.NOMBRE%TYPE,
apellido VARCHAR2(25) DEFAULT ‘Martín’,
edad NUMBER);
datos_alumno alumnos_record;
...
BEGIN
...
datos_alumno.nombre:=“Manuel”;
Paquetes, Procedimientos y
funciones PL/SQL
20 Qualitas
Sistemas de Información
2 Tipos de Datos Compuestos: Tablas
•Dos componentes
•Tipo de datos BINARY_INTEGER para clave primaria
•Columna de tipos de datos escalares o de registro
Paquetes, Procedimientos y
funciones PL/SQL
21 Qualitas
Sistemas de Información
2 Tipos de Datos Compuestos: Tablas
SINTAXIS
DECLARE
TYPE nombre_table_type IS TABLE OF alumnos.nombre%TYPE
INDEX BY BINARY_INTEGER;
TYPE fecha_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
nombre_table nombre_table_type;
fecha_table fecha_table_type;
BEGIN
nombre_table(1) := ‘MANOLO’;
fecha_table(8) := SYSDATE + 7;
IF nombre.table.EXISTS(1) THEN
INSERT INTO .....
.......
END;
Paquetes, Procedimientos y
funciones PL/SQL
22 Qualitas
Sistemas de Información
2 Tipos de Datos Compuestos: Tablas
Los siguientes métodos hacen que las tablas PL/SQL sean más
fáciles de usar:
Paquetes, Procedimientos y
funciones PL/SQL
23 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
24 Qualitas
Sistemas de Información
3 Estructuras de Control: IF-THEN-ELSE
IF-THEN-ELSE
IF expr1 THEN
secuencia_ordenes1;
[ELSIF expr2 THEN
secuencia_ordenes2;]
...
[ELSE
secuencia_ordenes3;]
END IF;
Paquetes, Procedimientos y
funciones PL/SQL
25 Qualitas
Sistemas de Información
3 Estructuras de Control: Bucles (I)
Bucles Simples
Es el tipo más básico. Su sintaxis es:
LOOP
secuencia_ordenes;
END LOOP;
Paquetes, Procedimientos y
funciones PL/SQL
26 Qualitas
Sistemas de Información
3 Estructuras de Control: Bucles (II)
Bucles WHILE
La sintaxis es la siguiente:
Paquetes, Procedimientos y
funciones PL/SQL
27 Qualitas
Sistemas de Información
3 Estructuras de Control: Bucles (III)
Paquetes, Procedimientos y
funciones PL/SQL
28 Qualitas
Sistemas de Información
3 Estructuras de Control: Bucles (IV)
Paquetes, Procedimientos y
funciones PL/SQL
29 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
30 Qualitas
Sistemas de Información
4 Cursores
Paquetes, Procedimientos y
funciones PL/SQL
31 Qualitas
Sistemas de Información
4 Cursores Implícitos
Paquetes, Procedimientos y
funciones PL/SQL
32 Qualitas
Sistemas de Información
4 Cursores Implícitos
EJEMPLO 1
DECLARE
db_nombre VARCHAR(25) := ‘MANUEL’;
BEGIN
DELETE FROM alumnos
WHERE nombre = db_nombre;
DBMS_OUTPUT.PUT_FILE(SQL%ROWCOUNT ||‘ filas
borradas.’);
END;
Paquetes, Procedimientos y
funciones PL/SQL
33 Qualitas
Sistemas de Información
4 Cursores Implícitos
EJEMPLO 2
BEGIN
UPDATE clases
SET numero_sitios = 100
WHERE clase_id = 12;
IF SQL%NOTFOUND THEN
INSERT INTO clases (clase_id, numero_sitios)
VALUES(12, 100);
END IF;
END;
Paquetes, Procedimientos y
funciones PL/SQL
34 Qualitas
Sistemas de Información
4 Cursores Implícitos
EJEMPLO 3
DECLARE
db_clase clases%ROWTYPE;
BEGIN
SELECT *
INTO db_clase
FROM clases
WHERE clase_id = 12;
IF SQL%NOTFOUND THEN
INSERT INTO log_table
VALUES (error.nextval, ‘Not found’)
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO log_table
VALUES (error.nextval, ‘Not found, exception handler’)
END;
Paquetes, Procedimientos y
funciones PL/SQL
35 Qualitas
Sistemas de Información
4 Cursores: Control de Cursores Explícitos
No
Sí
DECLARE OPEN FETCH ¿VACÍO
?
CLOSE
Paquetes, Procedimientos y
funciones PL/SQL
36 Qualitas
Sistemas de Información
4 Cursores: Declaración del Cursor
Sintaxis
CURSOR cursor_name IS
select_statement
Paquetes, Procedimientos y
funciones PL/SQL
37 Qualitas
Sistemas de Información
4 Cursores: Apertura del Cursor
Sintaxis
OPEN cursor_name;
Paquetes, Procedimientos y
funciones PL/SQL
38 Qualitas
Sistemas de Información
4 Cursores: Recuperación de Datos del Cursor
Sintaxis
Paquetes, Procedimientos y
funciones PL/SQL
39 Qualitas
Sistemas de Información
4 Cursores: Cierre del Cursor
Sintaxis
CLOSE cursor_name;
Paquetes, Procedimientos y
funciones PL/SQL
40 Qualitas
Sistemas de Información
4 Cursores: Ejemplo 1
EJEMPLO 1
DECLARE
db_nombre alumnos.nombre%TYPE;
db_apellido alunmos.apellido%TYPE;
dn_edad alumnos.edad%TYPE;
v_edad NUMBER :=30;
CURSOR c_alumnos IS
SELECT nombre, apellido, edad
FROM alumnos
WHERE edad < v_edad;
BEGIN
OPEN c_alumnos;
LOOP
FETCH c_alumnos INTO db_nombre, db_apellido, db_edad;
EXIT WHEN c_alumnos%NOTFOUND;
END LOOP;
CLOSE c_alumnos;
END;
Paquetes, Procedimientos y
funciones PL/SQL
41 Qualitas
Sistemas de Información
4 Cursores: Ejemplo 2
Paquetes, Procedimientos y
funciones PL/SQL
42 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
43 Qualitas
Sistemas de Información
5 Procedimientos
Paquetes, Procedimientos y
funciones PL/SQL
44 Qualitas
Sistemas de Información
5 Procedimientos
Sintaxis
Paquetes, Procedimientos y
funciones PL/SQL
45 Qualitas
Sistemas de Información
5 Procedimientos
Editor
Oracle Code
SQL*Plus Code
Procedure
Builder Save SQL> START file.sql
1 2
Source Code
Compile
P Code
Execute
Paquetes, Procedimientos y
funciones PL/SQL
46 Qualitas
Sistemas de Información
5 Procedimientos: Ejemplo
EJEMPLO
CREATE OR REPLACE PROCEDURE busca_alumno (
p_alumnos_id IN NUMBER,
p_resultado OUT VARCHAR2(50)) IS
v_nombre alumnos.nombre%TYPE;
v_apellido alumnos.apellido%TYPE;
BEGIN
SELECT nombre, apellido
INTO v_nombre, v_apellido
FROM alumnos
WHERE alumno_id:=p_alumnos_id;
p_resultado:=v_nombre||’ ‘||v_apellido;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_resultado:=‘N/A’;
END busca_alumno;
Paquetes, Procedimientos y
funciones PL/SQL
47 Qualitas
Sistemas de Información
5 Funciones
Sintaxis
• Una función es un bloque nombrado PL/SQL que devuelve un
valor.
• Una función puede estar almacenada en la B.D, como objeto de
la B.D, para repetidas ejecuciones.
•Una función puede ser llamada como parte de una expresión.
Paquetes, Procedimientos y
funciones PL/SQL
48 Qualitas
Sistemas de Información
6 Funciones
Sintaxis
CREATE [OR REPLACE] FUNCTION FUNCTION_name
(argument 1 [mode1] datatype1,
(argument 2 [mode2] datatype2,
….
RETURN datatype
IS | AS
PL/SQL Block;
Paquetes, Procedimientos y
funciones PL/SQL
49 Qualitas
Sistemas de Información
5 Funciones
Editor
Oracle Code
SQL*Plus Code
Procedure
Builder Save SQL> START file.sql
1 2
Compile
P Code
Execute
Paquetes, Procedimientos y
funciones PL/SQL
50 Qualitas
Sistemas de Información
5 Funciones
Paquetes, Procedimientos y
funciones PL/SQL
51 Qualitas
Sistemas de Información
5 Funciones
Ejecución de Funciones en
SQL*Plus: Ejemplo
Entorno de llamada Función obtener_edad
7934 v_alumno_id
RETURN v_edad
Paquetes, Procedimientos y
funciones PL/SQL
52 Qualitas
Sistemas de Información
5 Funciones
Paquetes, Procedimientos y
funciones PL/SQL
53 Qualitas
Sistemas de Información
5 Funciones
Paquetes, Procedimientos y
funciones PL/SQL
54 Qualitas
Sistemas de Información
5 Funciones
Paquetes, Procedimientos y
funciones PL/SQL
55 Qualitas
Sistemas de Información
5 Paquetes
Paquetes, Procedimientos y
funciones PL/SQL
56 Qualitas
Sistemas de Información
5 Paquetes
Desarrollo de un Paquete
Editor
Oracle Code
SQL*Plus Code
Procedure
Builder Save SQL> START file.sql
1 2
Compile
P Code
Execute
Paquetes, Procedimientos y
funciones PL/SQL
57 Qualitas
Sistemas de Información
5 Paquetes
Paquetes, Procedimientos y
funciones PL/SQL
58 Qualitas
Sistemas de Información
5 Paquetes
Sintaxis:
CREATE [OR REPLACE] PACKAGE BODY package_name
IS | AS
private type and item declarations
subprogram bodies
END package_name;
Paquetes, Procedimientos y
funciones PL/SQL
59 Qualitas
Sistemas de Información
5 Paquetes
Paquetes, Procedimientos y
funciones PL/SQL
60 Qualitas
Sistemas de Información
5 Paquetes
Paquetes, Procedimientos y
funciones PL/SQL
61 Qualitas
Sistemas de Información
5 Paquetes
Paquetes, Procedimientos y
funciones PL/SQL
62 Qualitas
Sistemas de Información
5 Paquetes
Paquetes, Procedimientos y
funciones PL/SQL
63 Qualitas
Sistemas de Información
5 Paquetes
• DBMS_ALERT • DBMS_JOB
• DBMS_APPLICATION_INFO • DBMS_LOCK
• DBMS_DDL • DBMS_MAIL
• DBMS_DESCRIBE • DBMS_OUTPUT
Paquetes, Procedimientos y
funciones PL/SQL
64 Qualitas
Sistemas de Información
5 Paquetes
• DBMS_PIPE
• DBMS_SESSION
• DBMS_SHARED_POOL
• DBMS_SQL
• DBMS_TRANSACTION
• DBMS_UTILITY
• UTL_FILE
Paquetes, Procedimientos y
funciones PL/SQL
65 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
66 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
67 Qualitas
Sistemas de Información
6 Triggers
Creación de Triggers
Paquetes, Procedimientos y
funciones PL/SQL
68 Qualitas
Sistemas de Información
6 Triggers
Componentes de un Trigger
Momento de disparo.
• BEFORE: El código del cuerpo del trigger se ejecutará antes del
evento DML (Lenguaje de manipulación de Datos)
• AFTER: El código del cuerpo del trigger se ejecutará despues
del evento DML
• INSTEAD OF (sustitución): El código del cuerpo del trigger se
ejecutará en lugar de la sentencia.
Paquetes, Procedimientos y
funciones PL/SQL
69 Qualitas
Sistemas de Información
6 Triggers
Componentes de un Trigger
Paquetes, Procedimientos y
funciones PL/SQL
70 Qualitas
Sistemas de Información
6 Triggers
Componentes de un Trigger
Paquetes, Procedimientos y
funciones PL/SQL
71 Qualitas
Sistemas de Información
6 Triggers
Componentes de un Trigger
Paquetes, Procedimientos y
funciones PL/SQL
72 Qualitas
Sistemas de Información
6 Triggers
Secuencia de disparo de un trigger en una tabla, cuando se manipula una sola fila:
Sentencia DML
SQL> INSERT INTO dept (deptno, dname, loc)
2 VALUES (50, ‘EDUCATION’, ‘NEW YORK’);
Tabla DEPT
trigger BEFORE sentencia
DEPTNO DNAME LOC
20 RESEARCH DALLAS
trigger BEFORE fila
30 SALES CHICAGO
40 OPERATIONS BOSTON
trigger AFTER fila
Paquetes, Procedimientos y
funciones PL/SQL
73 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
74 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
75 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
76 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
77 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
78 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
79 Qualitas
Sistemas de Información
6 Triggers
Paquetes, Procedimientos y
funciones PL/SQL
80 Qualitas
Sistemas de Información
6 Triggers
• Recompilar un trigger
ALTER TRIGGER trigger_name COMPILE
Paquetes, Procedimientos y
funciones PL/SQL
81 Qualitas
Sistemas de Información
Agenda
3 Estructuras de Control
4 Cursores
6 Triggers
7 Gestión de Excepciones
Paquetes, Procedimientos y
funciones PL/SQL
82 Qualitas
Sistemas de Información
7 Gestión de excepciones: Conceptos
Paquetes, Procedimientos y
funciones PL/SQL
83 Qualitas
Sistemas de Información
7 Gestión de excepciones: Tipos de Excepciones
Oracle
Provocada
Definida por el usuario
explícitamente
Paquetes, Procedimientos y
funciones PL/SQL
84 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (I)
Sintaxis
EXCEPTION
WHEN exception1 [OR exception2...] THEN
statement1;
statement2;
...
[WHEN exception3 [OR exception4...] THEN
statement1;
statement2;
...]
[WHEN OTHERS THEN
statement1;
statement2;
...]
Paquetes, Procedimientos y
funciones PL/SQL
85 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (II)
Paquetes, Procedimientos y
funciones PL/SQL
86 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (III)
Sección Declarativa
Paquetes, Procedimientos y
funciones PL/SQL
87 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (III) : Ejemplo
EJEMPLO
DECLARE
e_MissingNull EXCEPTION:
PRAGMA EXCEPTION_INIT(e_MissingNull, -1400);
BEGIN
INSERT INTO clases (clase_id) VALUES (null);
EXCEPTION
WHEN e_MissingNull then
INSERT INTO log_table (info) VALUES (‘ORA-1400 ocurred’);
END;
Paquetes, Procedimientos y
funciones PL/SQL
88 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (IV)
Paquetes, Procedimientos y
funciones PL/SQL
89 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (IV) : Ejemplo 1
EJEMPLO 1
DECLARE
e_DemasiadosAlumnos EXCEPTION;
v_NumeroAlumnos NUMBER(3);
v_MaxAlumnos NUMBER(3);
BEGIN
SELECT numero_alumnos, max_alumnos
INTO v_NumeroAlumnos, v_MaxAlumnos
FROM clases
WHERE departamento = ‘MATEMATICAS’;
IF v_NumeroAlumnos > v_MaxAlumnos THEN
RAISE e_DemasiadosAlumnos;
END IF;
EXCEPTION
WHEN e_DemasiadosAlumnos THEN
INSERT INTO log_table (info) VALUES (‘La clase de Mate tiene ‘||
v_NumeroAlumnos||’ alumnos: máximo permitido ‘||v_MaxAlumnos);
END;
Paquetes, Procedimientos y
funciones PL/SQL
90 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (IV) : Ejemplo 2
EJEMPLO 2
DECLARE
db_count NUMBER;
BEGIN
SELECT count(1)
INTO db_count
FROM alumnos
WHERE nombre=‘MANUEL’;
IF db_count = 0 THEN
RAISE_APPLICATION_ERROR(20001,’No existe alumno
MANUEL’);
END ID
END;
Paquetes, Procedimientos y
funciones PL/SQL
91 Qualitas
Sistemas de Información
Qualitas
Sistemas de Información
Paquetes, Procedimientos y
funciones PL/SQL
92 Qualitas
Sistemas de Información