Вы находитесь на странице: 1из 92

PL/SQL

DMR Consulting

Febrero, 2005

Paquetes, Procedimientos y
funciones PL/SQL
1 Qualitas
Sistemas de Información
Agenda

1 Visión General de PL/SQL.

2 Declaración de variables y tipo datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

6 Triggers

7 Gestión de Excepciones

Paquetes, Procedimientos y
funciones PL/SQL
2 Qualitas
Sistemas de Información
Agenda

1 Visión General de PL/SQL.

2 Declaración de variables y tipo datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

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

Mediante sentencias SQL podemos acceder a datos de Oracle y


utilizando sentencias de control de PL/SQL procesar estos datos.

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)

PL/SQL es un lenguaje estructurado en bloques, de modo que cada


unidad PL/SQL puede contener uno o más bloques los cuales pueden
estar compuestos de hasta 3 secciones:
 Declarativa (Opcional): Contiene las variables, constantes, cursores y
excepciones definidas por el usuario, a las que se hará referencia en la
sección ejecutable.
 Ejecutable (Necesaria): Contiene sentencias SQL para manipular datos de la
base de datos y sentencias PL/SQL para manipular datos del bloque. Debe
iniciarse con la palabra clave BEGIN. Obligatorio una order ejecutable.
 Gestión de Excepciones (Opcional): Especifica las acciones en caso de error
o de condiciones anormales dentro de la sección ejecutable.

Independientemente, pueden declararse variables y gestionarse


excepciones localmente, dentro del bloque que las utiliza.
Todo bloque PL/SQL debe cerrarse con la palabra clave END.

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

ANÓNIMO PROCEDIMIENTO FUNCIONES

[DECLARE] PROCEDURE nombre FUNCTION nombre


IS RETURN tipo dato
BEGIN IS
-- BEGIN BEGIN
sentencias -- --
sentencias sentencias
[EXCEPTION] RETURN valor;
[EXCEPTION]
END; [EXCEPTION]
END;
END;

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

•No se puedes utilizar palabras reservadas (BEGIN, END…)


•Literales de tipo carácter delimitados por comillas simples
(‘12345’, ‘Madrid’…)
•Identificadores delimitados entre comillas. Diferenciar
entre mayúsculas y minúsculas, palabras reservadas….
(“EXCEPTION”)
• No se pueden emplear órdenes DDL (definición de datos).
Ej: CREATE, ALTER, DROP, GRANT, REVOKE
• Si órdenes DML (manipulación de datos). Ej: SELECT,
INSERT, UPDATE, DELETE…

Paquetes, Procedimientos y
funciones PL/SQL
11 Qualitas
Sistemas de Información
Agenda

1 Visión General de PL/SQL.

2 Declaración de variables y tipo datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

6 Triggers

7 Gestión de Excepciones

Paquetes, Procedimientos y
funciones PL/SQL
12 Qualitas
Sistemas de Información
2 Variables

El uso de variables en PL/SQL posibilita:

 Almacenamiento temporal de datos.


 Manipulación de valores almacenados: Las variables se pueden utilizar
para realizar cálculos, etc
 Reutilidad: Una vez declaradas, las variables se pueden utilizar
repetidamente dentro de una aplicación.
 Facilidad de Mantenimiento.

Paquetes, Procedimientos y
funciones PL/SQL
13 Qualitas
Sistemas de Información
2 Variables: Gestión de Variables

• Declaración e inicialización de las variables dentro de la


sección de declaración.
• Asignación de nuevos valores dentro de la sección de código
(ejecución).
• Transferencia de valores a bloques PL/SQL a través de
parámetros (IN, OUT, IN/OUT)
• Ver los resultados a través de las variables de salida.

Paquetes, Procedimientos y
funciones PL/SQL
14 Qualitas
Sistemas de Información
2 Variables: Sintaxis

Sintaxis

identificador [CONSTANT] tipo dato [NOT NULL]


[:= | DEFAULT expresión]
 identificador es el nombre de la variable.
 CONSTANT restringe la variable para que no pueda cambiar su valor. Las
constantes deben ser inicializadas.
 Tipo dato es un tipo de datos escalar, compuesto, referenciado o LOB.
 NOT NULL restringe la variable, de modo que no pueda ser nulo su valor.
Este tipo de variables deben ser inicializadas.
 Expresión es cualquier expresión PL/SQL. Puede ser un literal, otra
variable o una expresión que incluya operadores y funciones.

Ej: db_nombre VARCHAR2(25) NOT NULL :=“PEPE”;

Paquetes, Procedimientos y
funciones PL/SQL
15 Qualitas
Sistemas de Información
2 Variables: Tipos de Variables (I)

Tipos escalares Tipos LOB


Numéricos De carácter
Binary_integer Char Bfile

Dec Long Lob


Decimal String Clob
Double Varchar Nlob
Float Varchar2…
Int
Integer Booleanos
Natural Boolean
Number
Positive De fecha
Real… Date

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)

También es posible declarar variables definiéndolas como Tipos de


Datos Compuestos mediante las sentencias RECORD (Registro
PL/SQL), TABLE (Tabla PL/SQL) o VARRAY.

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

•Deben tener al menos un componente (campos) de cualquier


tipo: escalar, REGISTRO o TABLA PL/SQL
•Tratan una colección de campos como una unidad lógica
•Son adecuados para recuperar una fila de datos de una tabla
para su procesamiento.
•Un registro puede formar parte de otros registros
•Los valores no asignados se inicializan en NULL, y puede
definirse valores DEFAULT
•Uso del atributo %ROWTYPE

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

•Aumentan dinámicamente porque no tienen restricciones


•Uso del atributo %ROWTYPE

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

MÉTODOS PARA LAS TABLAS PL/SQL

Los siguientes métodos hacen que las tablas PL/SQL sean más
fáciles de usar:

• EXISTS – True si existe en la tabla el elemento


• COUNT – Número de filas de la tabla
• FIRST y LAST – Índice de 1ª o última fila
• NEXT – Índice de fila posterior
• DELETE – Borra filas de la tabla
•….

Paquetes, Procedimientos y
funciones PL/SQL
23 Qualitas
Sistemas de Información
Agenda

1 Visión General de PL/SQL

2 Declaración de variables y tipo datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

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

PL/SQL como otros lenguajes de 3ª generación, tiene diversas


estructuras que permiten controlar el comportamiento del bloque a
medida que este se ejecuta. Entre estas estructuras se incluyen
las ordenes condicionales y los bucles.

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)

PL/SQL permite ejecutar ordenes de forma repetida utilizando


bucles. Existen 4 tipos de bucles: bucles simples, bucles WHILE,
bucles FOR numéricos y bucle FOR de cursor.

Bucles Simples
Es el tipo más básico. Su sintaxis es:
LOOP
secuencia_ordenes;
END LOOP;

Para añadir una condición de parada del bucle y que este no se


ejecute indefinidamente utilizamos la orden EXIT:
EXIT [WHEN condición];

Esta estructura es equivalente a: IF condición THEN EXIT END


IF;

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:

WHILE condición LOOP


secuencia_ordenes;
END LOOP;

En este tipo de bucles la condición se evalúa antes de cada


iteración del bucle. Si es verdadera se ejecuta la secuencia de
ordenes y sino el bucle termina y el control se transfiere a lo que
esté detrás de la orden END LOOP.

Paquetes, Procedimientos y
funciones PL/SQL
27 Qualitas
Sistemas de Información
3 Estructuras de Control: Bucles (III)

Bucles FOR numéricos

A diferencia de los bucles simples y de los bucles WHILE, en este


tipo de estructuras el número de iteraciones está definido. La
sintaxis es la siguiente:

FOR contador_bucle IN [REVERSE] limite_inferior..limite_superior


LOOP
END LOOP;

El contador_bucle es la variable índice declarada de modo


explicito, y los límites especifican el número de iteraciones.

La palabra clave REVERSE define las iteraciones en el bucle desde


el límite superior al inferior.

Paquetes, Procedimientos y
funciones PL/SQL
28 Qualitas
Sistemas de Información
3 Estructuras de Control: Bucles (IV)

Bucles de cursor FOR


 Los bucles FOR de cursor procesan filas en un cursor
explicito.
 Es un método abreviado ya que se abre el cursor, y se
recuperan filas de una en una para cada iteración del bucle,
cerrándose el cursor automáticamente cuando se han
procesado todas las filas.
 El propio bucle termina automáticamente al final de la
iteración en la que se recupero la última fila.
FOR record_name IN cursor_name LOOP
statement1;
statement2;
...
END LOOP

Paquetes, Procedimientos y
funciones PL/SQL
29 Qualitas
Sistemas de Información
Agenda

1 Visión General de PL/SQL

2 Declaración de variables y tipo datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

6 Triggers

7 Gestión de Excepciones

Paquetes, Procedimientos y
funciones PL/SQL
30 Qualitas
Sistemas de Información
4 Cursores

•Un Cursor es un área de trabajo privada de SQL


•Existen cursores implícitos y explícitos
•El Servidor Oracle utiliza cursores implícitos para
analizar y ejecutar las sentencias SQL
•Los cursores explícitos son declarados
explícitamente por el programador

Paquetes, Procedimientos y
funciones PL/SQL
31 Qualitas
Sistemas de Información
4 Cursores Implícitos

•Los atributos de cursor SQL permiten comprobar los resultados


de una consulta SQL

SQL%ROWCOUNT Número de filas afectadas por la sentencia


SQL más reciente (valor entero)

SQL%FOUND Atributo booleano que da como resultado


TRUE si la sentencia SQL más reciente
afecta a una o más filas
SQL%NOTFOUND Atributo booleano que da como resultado
TRUE si la sentencia SQL más reciente no
afecta a ninguna fila
SQL%ISOPEN Siempre FALSE en cursores implícitos,
porque PL/SQL los cierra de forma
automática

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


DECLARE OPEN FETCH ¿VACÍO
?
CLOSE

• Crear un • Identificar • Cargar la • Buscar filas • Liberar el


área SQL el juego fila actual en existentes juego activo
específica activo variables
• Volver a
FETCH si
encontró
filas

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

 Utilizar la sentencia CURSOR para declarar un cursor explicito.


 No incluir la cláusula INTO en la declaración del cursor, porque
aparecerá posteriormente en la sentencia FETCH.
 Si es necesario procesar filas en una secuencia, utilizar la
cláusula ORDER BY en la consulta.

Paquetes, Procedimientos y
funciones PL/SQL
37 Qualitas
Sistemas de Información
4 Cursores: Apertura del Cursor

Sintaxis

OPEN cursor_name;

 Abrir el cursor para ejecutar la consulta e identificar el juego


activo.
 Si la consulta no devuelve ninguna fila, no se producirá ninguna
excepción.
 Utilizar los atributos del cursor para comprobar los resultados
producidos tras una recuperación.

Paquetes, Procedimientos y
funciones PL/SQL
38 Qualitas
Sistemas de Información
4 Cursores: Recuperación de Datos del Cursor

Sintaxis

FETCH cursor_name INTO [variable1,variable2,...]


/record_name];

 Recuperar los valores de la fila actual e introducirlos en


variables de salida.
 Incluir el mismo número de variables en la cláusula INTO de la
sentencia FETCH que las columnas de salida en la sentencia
SELECT.
 Relacionar posicionalmente las variables y las columnas.

Paquetes, Procedimientos y
funciones PL/SQL
39 Qualitas
Sistemas de Información
4 Cursores: Cierre del Cursor

Sintaxis

CLOSE cursor_name;

Cerrar el cursor una vez completado el procesamiento de las filas.


 Volver a abrir el cursor si es necesario.
 No intentar recuperar los datos de un cursor una vez que ha
sido cerrado.

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

EJEMPLO 2 (Cursor parametrizado)


DECLARE
db_nombre alumnos.nombre%TYPE;
db_apellido alunmos.apellido%TYPE;
dn_edad alumnos.edad%TYPE;
CURSOR c_alumnos (v_edad alumnos.edad%TYPE) IS
SELECT nombre, apellido, edad
FROM alumnos
WHERE edad < v_edad;
BEGIN
OPEN c_alumnos(30);
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
42 Qualitas
Sistemas de Información
Agenda

1 Visión General de PL/SQL

2 Declaración de variables y tipo de datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

6 Triggers

7 Gestión de Excepciones

Paquetes, Procedimientos y
funciones PL/SQL
43 Qualitas
Sistemas de Información
5 Procedimientos

Visión General de los Procedimientos

• Un procedimiento es un bloque PL/SQL nombrado que realiza una


acción.
• Un procedimiento puede estar almacenado en la base de datos,
como un objeto de la B.D, para ser ejecutado múltiples veces.

Paquetes, Procedimientos y
funciones PL/SQL
44 Qualitas
Sistemas de Información
5 Procedimientos

Sintaxis

CREATE [OR REPLACE] PROCEDURE procedure_name


(argument 1 [mode1] datatype1,
(argument 2 [mode2] datatype2,
….
IS [AS]
PL/SQL Block;

Paquetes, Procedimientos y
funciones PL/SQL
45 Qualitas
Sistemas de Información
5 Procedimientos

Desarrollo de Proc. Almacenados

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;

SQL> Execute busca_alumno(10);

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

Creación de una función

Editor
Oracle Code
SQL*Plus Code
Procedure
Builder Save SQL> START file.sql
1 2

Oracle Source Code

Compile

P Code

Execute
Paquetes, Procedimientos y
funciones PL/SQL
50 Qualitas
Sistemas de Información
5 Funciones

Creación de una Función Almacenada usando SQL*Plus

SQL> CREATE [OR REPLACE] FUNCTION obtener_edad


2 (v_alumno_id IN alumnos.alumno_id%TYPE)
3 RETURN NUMBER
4 IS
5 v_edad alumnos.edad%TYPE :=0;
6 BEGIN
7 SELECT edad
8 INTO v_edad
9 FROM alumnos
10 WHERE alumno_id = v_alumno_id;
11 RETURN (v_edad);
12 END obtener_edad;
13 /

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

SQL> START obtener_edad.sql


Procedure created.

SQL> VARIABLE g_edad number

SQL> EXECUTE :g_edad := obtener_edad (7934)


PL/SQL procedure succesfully completed.

SQL> PRINT g_edad


G_edad.
---------------------------
1300

Paquetes, Procedimientos y
funciones PL/SQL
52 Qualitas
Sistemas de Información
5 Funciones

Invocar Funciones en expresiones SQL: Ejemplo

SQL> CREATE [OR REPLACE] FUNCTION tax


2 (v_value IN NUMBER)
3 RETURN NUMBER
4 IS
5 BEGIN
6 RETURN (v_value * .08);
7 END tax;
8 /
Function created.
SQL> SELECT empno, ename, sal, tax(sal)
2 FROM emp;

Paquetes, Procedimientos y
funciones PL/SQL
53 Qualitas
Sistemas de Información
5 Funciones

Desde dónde llamar a una Función de Usuario

• Como columna de un SELECT


• Condiciones en cláusulas WHERE y HAVING.
• Cláusulas CONNECT BY, START WITH, ORDER BY, y GROUP BY
• Cláusula VALUES de un comando INSERT
• Cláusula SET de un comando UPDATE

Paquetes, Procedimientos y
funciones PL/SQL
54 Qualitas
Sistemas de Información
5 Funciones

Llamada a Funciones desde Expresiones SQL: Restricciones

• Una función de usuario tiene que ser una función almacenada.


• Tiene que ser una función de registro, no de grupo.
• Sólo con parámetros IN.
• Los tipos de datos tienen que ser CHAR, DATE, o NUMBER
• Los tipos de datos no pueden ser PL/SQL como BOOLEAN,
RECORD o TABLE.

Paquetes, Procedimientos y
funciones PL/SQL
55 Qualitas
Sistemas de Información
5 Paquetes

Visión General sobre los Paquetes

• Agrupan de forma lógica conceptos PL/SQL relacionados; tipos


PL/SQL, items y subprogramas.
• Compuestos de 2 partes:
 Especificación
 Cuerpo
• Permiten a Oracle leer múltiples objetos en memoria, de una
sola vez.

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

Oracle Source Code

Compile

P Code

Execute
Paquetes, Procedimientos y
funciones PL/SQL
57 Qualitas
Sistemas de Información
5 Paquetes

Creación de la Especificación de un Paquete: Ejemplo

SQL> CREATE OR REPLACE PACKAGE comm_package IS


2 g_comm NUMBER :=10; -- inicializado a 10
3 PROCEDURE reset_comm
4 (v_comm IN NUMBER);
5 END comm_package;
6 /

Paquetes, Procedimientos y
funciones PL/SQL
58 Qualitas
Sistemas de Información
5 Paquetes

Creación del Cuerpo de un Paquete

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

Creación del Cuerpo de un Paquete: Ejemplo


SQL> CREATE OR REPLACE PACKAGE BODY comision_package IS
2 FUNCTION valida_comision
3 (v_comision IN NUMBER) RETURN BOOLEAN
4 IS
5 v_max_comision NUMBER;
6 BEGIN
7 SELECT MAX(comision)
8 INTO v_max_comision
9 FROM empleados;
10 IF v_comision > v_max_comision THEN RETURN (FALSE);
11 ELSE RETURN (TRUE);
12 END IF;
13 END valida_comision;

Paquetes, Procedimientos y
funciones PL/SQL
60 Qualitas
Sistemas de Información
5 Paquetes

Creación del Cuerpo de un Paquete: Ejemplo


14 PROCEDURE reset_comision
15 (v_comision IN NUMBER)
16 IS
17 v_valid BOOLEAN;
18 BEGIN
19 v_valid := valida_comision (v_comision);
20 IF v_valid = TRUE THEN
21 g_comm := v_comm;
22 ELSE
23 RAISE_APPLICATION_ERROR
24 (-20210, ‘Invalid commission’);
25 END IF;
26 END reset_comision;
27 END comision_package;
28 /

Paquetes, Procedimientos y
funciones PL/SQL
61 Qualitas
Sistemas de Información
5 Paquetes

Llamada a Procedimientos de un Paquete

Ejemplo 1: Llamada a un procedimiento de un paquete desde SQL*Plus:

SQL> EXECUTE comision_package.reset_comision (15);

Ejemplo 3: Llamada a un procedimiento de un paquete en un esquema diferente:

SQL> EXECUTE scott.comision_package.reset_comision (15);

Ejemplo 4: Llamada a un procedimiento de un paquete en una B.D. remota:

SQL> EXECUTE comision_package.reset_comision@ny (15);

Paquetes, Procedimientos y
funciones PL/SQL
62 Qualitas
Sistemas de Información
5 Paquetes

Ventajas de los Paquetes

• Modularidad: encapsular construcciones relacionadas.


• Diseño más sencillo de la aplicación: se programa y compila la
especificación y el cuerpo por separado.
• Funcionalidad añadida: variables y cursores persistentes.
• Mejor rendimiento:
 Se carga el paquete entero en memoria cuando se referencia
por primera vez.
 Una copia en memoria para todos los usuarios.
 Se simplifican las dependencias.

Paquetes, Procedimientos y
funciones PL/SQL
63 Qualitas
Sistemas de Información
5 Paquetes

Paquetes Proporcionados por Oracle

Varios procedimientos empaquetados vienen con el propio Oracle


para permitir tanto el acceso PL/SQL a ciertas características de
SQL, como ampliar la funcionalidad de la B.D.

• 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

Paquetes Proporcionados por Oracle

Varios procedimientos empaquetados vienen con el propio Oracle


para permitir tanto el acceso PL/SQL a ciertas características de
SQL, como ampliar la funcionalidad de la B.D.

• 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

1 Visión General de PL/SQL.

2 Declaración de variables y tipo datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

6 Triggers

7 Gestión de Excepciones

Paquetes, Procedimientos y
funciones PL/SQL
66 Qualitas
Sistemas de Información
6 Triggers

Visión General de los Triggers

• Un trigger es un bloque PL/SQL que se ejecuta implícitamente


cuando ocurre un evento.

Paquetes, Procedimientos y
funciones PL/SQL
67 Qualitas
Sistemas de Información
6 Triggers

Creación de Triggers

• Momento: BEFORE o AFTER


• Evento: INSERT o UPDATE o DELETE
• Nombre Tabla: On table
• Tipo de Trigger: Row o statement
• Claúsula When: Condición
• Cuerpo del Trigger: DECLARE
BEGIN
END

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

Evento: ¿ Qué operación DML provocará la ejecución trigger?


• INSERT
• UPDATE
• DELETE
• Cualquier combinación de las anteriores

Paquetes, Procedimientos y
funciones PL/SQL
70 Qualitas
Sistemas de Información
6 Triggers

Componentes de un Trigger

Tipo de Trigger (order, fila):


Número de veces que se ejecuta el trigger.
• Sentencia: El cuerpo del trigger se ejecuta sólo una vez para el
evento. Este es el comportamiento por defecto.
• Fila: El cuerpo del trigger se ejecuta una vez para cada registro
afectado por el evento

Paquetes, Procedimientos y
funciones PL/SQL
71 Qualitas
Sistemas de Información
6 Triggers

Componentes de un Trigger

Cuerpo del Trigger:


Realiza la acción del trigger
• El cuerpo del trigger es definido con un bloque PL/SQL anónimo
[DECLARE]
BEGIN
[EXCEPTION]
END;

Paquetes, Procedimientos y
funciones PL/SQL
72 Qualitas
Sistemas de Información
6 Triggers

Secuencia del disparo

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

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS
trigger BEFORE fila

30 SALES CHICAGO

40 OPERATIONS BOSTON
trigger AFTER fila

trigger AFTER sentencia

Paquetes, Procedimientos y
funciones PL/SQL
73 Qualitas
Sistemas de Información
6 Triggers

Sintaxis para la Creación y Definición de Triggers a nivel


de sentencia

CREATE [OR REPLACE] TRIGGER trigger_name


timing event1 [OR event2 OR event3]
ON table_name
PL/SQL block;

Paquetes, Procedimientos y
funciones PL/SQL
74 Qualitas
Sistemas de Información
6 Triggers

Trigger “Before Statement”: Ejemplo

SQL> CREATE OR REPLACE TRIGGER secure_emp


2 BEFORE INSERT ON emp
3 BEGIN
4 IF (TO_CHAR (sysdate, ‘DY’) IN (‘SAT’, ‘SUN’))
5 OR (TO_CHAR (sysdate, ‘HH24’) NOT BETWEEN
6 ’08’ AND ‘018’
7 THEN RAISE_APPLICATION_ERROR (-20500,
8 ‘You may only insert into EMP during normal
9 hours.’);
10 END IF
11 END;
12 /

Paquetes, Procedimientos y
funciones PL/SQL
75 Qualitas
Sistemas de Información
6 Triggers

Creación de un Trigger a Nivel de Registro

CREATE [OR REPLACE] TRIGGER trigger_name


timing event1 [OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old / NEW AS new]
FOR EACH ROW
[WHEN condition]
PL/SQL block;

Paquetes, Procedimientos y
funciones PL/SQL
76 Qualitas
Sistemas de Información
6 Triggers

Uso de los calificadores “OLD” y “NEW”

SQL> CREATE OR REPLACE TRIGGER audit_emp_values


2 AFTER DELETE OR INSERT OR UPDATE ON emp
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO audit_emp_values (user_name,
6 timestamp, id, old_last_name, new_last_name,
7 old_title, new_title, old_salary, new_salary)
8 VALUES (USER, SYSDATE, :old.empno, :old.ename,
9 :new.ename, :old.job, :new.job,
10 :old.sal, :new.sal);
11 END;
12 /

Paquetes, Procedimientos y
funciones PL/SQL
77 Qualitas
Sistemas de Información
6 Triggers

Condicionando un Trigger de Registro


SQL> CREATE OR REPLACE TRIGGER derive_commission_pct
2 BEFORE INSERT OR UPDATE OF sal ON emp
3 FOR EACH ROW
4 WHEN (new.job = ‘SALESMAN’)
5 BEGIN
6 IF INSERTING THEN :new.comm :=0;
7 ELSE /* UPDATE of salary */
8 IF :old.comm IS NULL THEN
9 :new.comm :=0;
10 ELSE
11 :new.comm := :old.comm * (:new.sal / :old.sal);
12 END IF;
13 END IF
14 END;
15 /

Paquetes, Procedimientos y
funciones PL/SQL
78 Qualitas
Sistemas de Información
6 Triggers

Creación de un trigger INSTEAD OF

CREATE [OR REPLACE] TRIGGER trigger_name


INSTEAD OF
event1 [OR event2 OR event3]
ON view_name
[REFERENCING OLD AS old / NEW AS new]
[FOR EACH ROW]
trigger_body

Paquetes, Procedimientos y
funciones PL/SQL
79 Qualitas
Sistemas de Información
6 Triggers

Ejemplo de trigger INSTEAD OF


CREATE VIEW total_ventas AS
SELECT vendedor, sum(venta) total_venta
FROM ventas
GROUP BY vendedor;

SQL> DELETE FROM total_ventas WHERE vendedor = 1;


SQL> ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view

CREATE OR REPLACE TRIGGER total_ventas_delete


INSTEAD OF INSERT ON total_ventas
FOR EACH ROW
BEGIN
DELETE FROM ventas
WHERE vendedor=:old.vendedor;
END total_ventas_delete;
/

Paquetes, Procedimientos y
funciones PL/SQL
80 Qualitas
Sistemas de Información
6 Triggers

Gestión de los Triggers

• Activar o desactivar un trigger de la B.D.

ALTER TRIGGER trigger_name DISABLE | ENABLE

• Activar o desactivar todos los triggers de una tabla

ALTER TABLE table_name DISABLE | ENABLE ALL TRIGGERS

• Recompilar un trigger
ALTER TRIGGER trigger_name COMPILE

Paquetes, Procedimientos y
funciones PL/SQL
81 Qualitas
Sistemas de Información
Agenda

1 Visión General de PL/SQL

2 Declaración de variables y tipo datos compuestos

3 Estructuras de Control

4 Cursores

5 Procedimientos, paquetes y funciones

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

 ¿Qué es una excepción?


 Identificador de PL/SQL que surge durante la ejecución.
 ¿Cómo surge?
 Se produce un error ORACLE.
 Es provocado explícitamente.
 ¿Cómo se gestiona?
 Interrumpiéndolo con un manejador.
 Propagándolo al entorno de llamadas.

Paquetes, Procedimientos y
funciones PL/SQL
83 Qualitas
Sistemas de Información
7 Gestión de excepciones: Tipos de Excepciones

 Predefinida por el Servidor


Oracle Provocada
 No predefinida por el Servidor implícitamente

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;
...]

SQLCODE-> Código Oracle del error actual.


SQLERR-> Texto del mensaje de error actual

Paquetes, Procedimientos y
funciones PL/SQL
85 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (II)

Interrupción de Errores Predefinidos por el Servidor Oracle


 Hay que hacer referencia al nombre estándar en la rutina de
gestión de excepciones.
 Ejemplos de excepciones predefinidas:
- NO_DATA_FOUND: SELECT..INTO no devuelve registros o referencia elemento de
tabla PL/SQL sin valor

- TOO_MANY_ROWS: SELECT..INTO devuelve más de un registro.

- INVALID_CURSOR: Operación no permitida en un cursor.

- INVALID_NUMBER: Fallo en intento de conversión de cadena de caracteres a


número.

- ZERO_DIVIDE: División por cero.

- DUP_VAL_ON_INDEX: Violación de restricción de unicidad.

Paquetes, Procedimientos y
funciones PL/SQL
86 Qualitas
Sistemas de Información
7 Interrupción de Excepciones (III)

Interrupción de Errores no Predefinidos por el Servidor


Oracle

Declare Associate Reference

Sección Declarativa

• Nombrar la • Codificar la • Gestionar la


excepción PRAGMA excepción
EXCEPTION_INIT

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)

Interrupción de Excepciones Definidas por el Usuario

Declare Raise Reference

Sección Declarativa Sección Ejecutable Sección de gestión de


excepciones

• Especificar la • Provocar explícitamente • Gestionar la


excepción la excepción utilizando la excepción
sentencia RAISE

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;

ORA 20001: No existe alumno MANUEL

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

Вам также может понравиться