You are on page 1of 47

1

Lenguaje PL/SQL
Taller Base de Datos
Prof. Francisco Vargas B.
2
Lenguaje PL/SQL
Procedural Language / Structured Query Language

SQL es un lenguaje de consulta para los
sistemas de bases de datos relacionales
(estndar).

PL/SQL amplia o potencia el lenguaje SQL
con los elementos caractersticos de los
lenguajes de programacin (oracle).
3
Lenguaje PL/SQL
Lenguaje de Programacin


Estructura de Programa.
Estructuras de Datos.
Estructuras de Asignacin.
Estructuras de Decisin.
Estructuras de Iteracin.
4
Lenguaje PL/SQL
Contenidos principales


Estructura del Lenguaje
Cursores
Funciones
Procedimientos Almacenados
Triggers
5
Lenguaje PL/SQL
Estructura del Lenguaje

El bloque es la unidad de estructura bsica
en los programas PL/SQL (rendimiento y
proceso).
Zona de Declaraciones. Opcional.
Objetos locales (variables, constantes...).
Zona de Instrucciones. Obligatoria.
Zona de Excepciones. Opcional.
Manejo de excepciones en el programa
6
Lenguaje PL/SQL
Estructura del Lenguaje

Sintaxis de un BLOQUE PL/SQL.
[ DECLARE | IS / AS ]
<declaraciones>
BEGIN
<instrucciones>
[ EXCEPTION ]
<tratamiento de excepciones>
END;
/
7
Lenguaje PL/SQL
Zona de Declaraciones

Declaracin de Variables

nombre_variable [CONSTANT] tipo [NOT NULL] [:= valor_inicial];

Ejemplos:
DECLARE
v_location VARCHAR2(15) := Granada;
c_comm CONSTANT NUMBER(3) := 160;
v_nombre tabla_empleados.nombre%TYPE;
8
Lenguaje PL/SQL
Zona de Declaraciones

Tipo de Variables

tipo_escalar: NUMBER | DATE | CHAR | VARCHAR | BOOLEAN

identificador%TYPE: Campo de una Tabla o Escalar

identificador%ROWTYPE: Registro de una Tabla o Fila
9
Lenguaje PL/SQL
Zona de Declaraciones

Declaracin de Registros (estructurado)

Ejemplo:
DECLARE
TYPE t_RegEstudiante IS RECORD (
Nombre VARCHAR2(20),
ApellidoPat VARCHAR2(20),
Edad NUMBER(3)
);

v_Estudiante t_Reg_Estudiante;
10
Lenguaje PL/SQL
Zona de Declaraciones

Declaracin de Cursores

CURSOR nombre_cursor [parmetros] IS consulta_SQL;

Ejemplo:
DECLARE
CURSOR emp_cursor IS
SELECT cod_emp, nom_emp
FROM empleados;
11
Lenguaje PL/SQL
Zona de Declaraciones

Declaracin de Excepciones

nombre_excepcin EXCEPTION;

Ejemplo:
DECLARE
demasiados_empleados EXCEPTION;
12
Lenguaje PL/SQL
Zona de Instrucciones

Tipos de Instrucciones

Instrucciones de ASIGNACIN

Instrucciones de DECISIN (control de flujo)

Instrucciones de ITERACIN (ciclos o bucles)
13
Lenguaje PL/SQL
Zona de Instrucciones

Instrucciones de Asignacin

variable_objetivo := expresin_PL/SQL;

SELECT lista_select
INTO lista_variables
FROM ...
WHERE... ;
14
Lenguaje PL/SQL
Zona de Instrucciones

Expresiones PL/SQL
Comilla simple para textos y formato decimal para numricos

Operadores nmeros: +, -, *, /, **(exponente), MOD (resto)
Operadores para textos: || (concatenacin)
Operadores lgicos: AND, OR, NOT
Operadores de cursores:
%ROWCOUNT
%NOTFOUND
%FOUND
%ISOPEN
15
Lenguaje PL/SQL
Zona de Instrucciones

Expresiones PL/SQL
Comparadores clsicos: <, <=, =, !=, >=, >
Comparadores SQL:
[NOT] LIKE
IS [NOT] NULL
[NOT] BETWEEN lim1 AND lim2
[NOT] IN (lista_valores)

Funciones predefinidas:
Caracteres, Numricas, Fechas, Conversin, Control de Errores
16
Lenguaje PL/SQL
Zona de Instrucciones

Instrucciones de Decisin (control de flujos)

IF expresin_lgica THEN intrucciones_PL/SQL;
[ELSIF expresin_lgica THEN intrucciones_PL/SQL;]

[ELSE intrucciones_PL/SQL;]
END IF;
17
Lenguaje PL/SQL
Zona de Instrucciones
Instrucciones de Decisin (IF-ELSE)

DECLARE
v_Inicio NUMBER;
BEGIN
v_Inicio := funcion_prueba;
IF v_Inicio > 100 THEN
RETURN (2 * v_Inicio);
ELSIF v_Inicio >= 50 THEN
RETURN (.5 * v_Inicio);
ELSE
RETURN (.1 * v_Inicio);
END IF;
END;
18
Lenguaje PL/SQL
Zona de Instrucciones

Instrucciones de Iteracin (ciclos o bucles)

LOOP intrucciones_PL/SQL [EXIT WHEN exp_lgica] END LOOP;

WHILE exp_lgica LOOP intrucciones_PL/SQL END LOOP;

FOR ctrl_numerico IN [REVERSE] v_ini .. V_fin LOOP
intrucciones_PL/SQL END LOOP;

FOR ctrl_cursor LOOP intrucciones_PL/SQL END LOOP;
19
Lenguaje PL/SQL
Zona de Instrucciones

Instrucciones de Iteracin (LOOP)

DECLARE
v_Contador BINARY_INTEGER := 1;
BEGIN
LOOP
INSERT INTO tabla (cod_fila) VALUES (v_Contador);
v_Contador := v_Contador + 1;
EXIT WHEN v_Contador = 10;
END LOOP;
END;
20
Lenguaje PL/SQL
Zona de Instrucciones

Instrucciones de Iteracin (WHILE)

DECLARE
v_Contador BINARY_INTEGER := 1;
BEGIN
WHILE v_Contador <= 10 LOOP
INSERT INTO tabla (cod_fila) VALUES (v_Contador);
v_Contador := v_Contador + 1;
END LOOP;
END;
21
Lenguaje PL/SQL
Zona de Instrucciones

Instrucciones de Iteracin (FOR numrico)


BEGIN
FOR v_Contador IN 1..10 LOOP
INSERT INTO tabla (cod_fila) VALUES (v_Contador);
END LOOP;
END;
22
Lenguaje PL/SQL
Zona de Excepciones

Generalidades

Qu es una excepcin?
Se trata de una interrupcin que se produce cuando
se identifica un error en tiempo de ejecucin.
Cmo se activa?
La puede activar ORACLE, al detectar el error.
Puede ser programada, en base a lo que se defina
como error.
23
Lenguaje PL/SQL
Zona de Excepciones (sintaxis)

EXCEPTION
WHEN excepcion1 [OR excepcion2 . . .] THEN
instruccion_1;
instruccion_N;
[WHEN excepcion3 [OR excepcion4 . . .] THEN
instruccion_1;
instruccion_N;]
[WHEN OTHERS THEN
instruccion_1;
instruccion_N;]

24
Lenguaje PL/SQL
Zona de Excepciones (ejemplo)

EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK;
TEXT_IO.PUT_LINE(TO_CHAR(v_prod_id)) || Es invalido.);
WHEN TOO_MANY_ROWS THEN
ROLLBACK;
TEXT_IO.PUT_LINE (Datos Corruptos en S_PRODUCTO.);
WHEN OTHERS THEN
ROLLBACK;
TEXT_IO.PUT_LINE (Otro error ocurrido.);

25
Lenguaje PL/SQL
Zona de Excepciones (propias)

DECLARE
e_cant_restante EXCEPTION;
. . .
BEGIN
. . .
RAISE e_cant_restante;
. . .
EXCEPTION
WHEN e_cant_restante THEN
TEXT_IO.PUT_LINE (Hay suficiente inventario.');
. . .
END;
26
Lenguaje PL/SQL
Estructura del Lenguaje


Transacciones en SQL

COMMIT: refleja en forma definitiva los cambios
realizados.
ROLLBACK: aborto explcito de la transaccin
(todo vuelve a quedar como al principio).

Se considera una mala practica no usar commit o rollback explcitos.

27
Lenguaje PL/SQL
Estructura del Lenguaje
BLOQUES ANIDADOS

DECLARE
x BINARY_INTEGER;
BEGIN
...
DECLARE
y NUMBER;
BEGIN
...
END;
...
END;
Alcance X
Alcance Y
28
Lenguaje PL/SQL
Estructura del Lenguaje
CONVENCIONES DE CODIGO

INDENTACION DE NIVELES DE CODIGO

Comandos SQL
Palabras claves PL/SQL
Tipos de Datos
identificadores y Parmetros
Tablas y Columnas BD
SELECT, INSERT
DECLARE, BEGIN, IF
VARCHAR, BOOLEAN
v_sal, empl_cursor, g_sal
s_empl, fecha_orden, id
29
Lenguaje PL/SQL
Estructura del Lenguaje
CONVENCIONES DE CODIGO

OJO CON PALABRAS RESERVADAS
VARIABLES
CONSTANTES
CURSORES
EXCEPCIONES
REGISTRO

v_contador
c_mensualidad
empleado_cursor
e_salto_pagina
cliente_registro

30
Lenguaje PL/SQL
Estructura del Lenguaje

CURSORES
Es una estructura de datos que registra una
consulta SELECT de SQL, que devuelve un
resultado y que permite acceder a cada fila
de dicha consulta.
Implcitos: def. sistema (DML, PL/SQL).
Explcitos: def. programador.
31
Lenguaje PL/SQL
Estructura del Lenguaje

Ciclo del Cursor
DECLARE FETCH OPEN
CLOSE
Crea un
rea de
memoria
Identifica y
carga los
registros a
procesar
Obtiene y
revisa los
registros
Controla si
hay datos
en el cursor
Libera los
registros y
la memoria
solicitada
No
Si
DATA?
32
Lenguaje PL/SQL
Zona de Declaraciones

Declaracin de Cursores

CURSOR nombre_cursor [parmetros] IS consulta_SQL;

Ejemplo:
DECLARE
CURSOR emp_cursor IS
SELECT cod_emp, nom_emp
FROM empleados;
33
Lenguaje PL/SQL
Zona de Instrucciones

Abrir el Cursor

OPEN nombre_cursor;

Reservar memoria.
Ejecutar SELECT.
Apuntar primer registro.

Si no hay registros, ORACLE no retorna excepcin.
34
Lenguaje PL/SQL
Zona de Instrucciones

Recorrer el Cursor (ciclo)

FETCH nombre_cursor INTO lista_variables;

LOOP
FETCH cursor INTO v_campo1, v_campoN;
Instrucciones_PL/SQL;
EXIT WHEN condicion_cursor;
END LOOP;
35
Lenguaje PL/SQL
Zona de Instrucciones

Cerrar el Cursor

CLOSE nombre_cursor;

Liberar memoria.
36
Lenguaje PL/SQL
Ejemplo de Cursores (ciclo)

(declaracin de cursor y variables)

OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_cod_emp, v_nom_emp;
DBMS_OUTPUT.PUT_LINE( v_cod_emp || y ' || v_nom_emp );
EXIT WHEN emp_cursor%NOTFOUND;
END LOOP;
CLOSE emp_cursor;

37
Lenguaje PL/SQL
Zona de Instrucciones

Recorrer el Cursor (ciclo FOR de cursores)

IMPLICITO: open, fetch, variable y close.

FOR variableRegistro IN cursor LOOP
Instrucciones_PL/SQL;
END LOOP;
38
Lenguaje PL/SQL
Ejemplo de Cursores (for de cursores)


(declaracin de cursor)


FOR regEmp IN emp_cursor LOOP
DBMS_OUTPUT.PUT_LINE(regEmp.cod_emp || y ' ||
regEmp.nom_emp );
END LOOP;

39
Lenguaje PL/SQL
Cursores con parmetros

DECLARE
CURSOR cur_persona(dep NUMBER, pue CHAR(15)) IS
SELECT nombre, apellidos
FROM empleados
WHERE departamento=dep AND puesto=pue;
BEGIN
OPEN cur_persona(12,administrativo);
...
CLOSE cur_persona;
END;
40
Lenguaje PL/SQL
Estructura del Lenguaje

Otros programas (procedimientos
almacenados, funciones y paquetes).
Zona de Encabezado. Obligatoria.
Identificadores y Parmetros.
Zona de Declaraciones. Opcional.
Objetos locales (variables, constantes...).
Zona de Instrucciones. Obligatoria.
Zona de Excepciones. Opcional.
Manejo de excepciones en el programa
41
Lenguaje PL/SQL
Estructura del Lenguaje

Sintaxis de un Procedimiento Almacenado.

CREATE [ OR REPLACE ] PROCEDURE nombre
[ ( parmetro1 [modo] tipo_dato ) [, ] ]
IS | AS
<declaraciones>
BEGIN
<instrucciones>
[ EXCEPTION ]
<tratamiento de excepciones>
END;
42
Lenguaje PL/SQL
Estructura del Lenguaje

Sintaxis de una Funcin.

CREATE [ OR REPLACE ] FUNCTION nombre
[ ( parmetro1 [modo] tipo_dato ) [, ] ]
RETURN tipo_de_datos
IS | AS
<declaraciones>
BEGIN
<instrucciones>
[ EXCEPTION ]
<tratamiento de excepciones>
END;
43
Lenguaje PL/SQL
TRIGGERS

Es un conjunto de instrucciones PL/SQL que
se ejecutan en el momento que una
operacin INSERT, UPDATE o DELETE de
SQL es aplicada a una tabla.

Permite implementar reglas de negocio.

44
Lenguaje PL/SQL
TRIGGERS (casos tpicos)

Cambiar el valor de una columna basado en
el valor de otras columnas de la misma u otra
tabla.
Validacin de valores de las columnas
(posiblemente comparando con valores de
otras tablas)
Documentar los cambios que se realizan
escribiendo sobre otra tabla (logfile).
45
Lenguaje PL/SQL
TRIGGERS (sintaxis)

CREATE [OR REPLACE] TRIGGER trigger-name
{BEFORE | AFTER} triggering-event
ON table-name
[FOR EACH ROW]
[WHEN (condition)]
PL/SQL-block

46
Lenguaje PL/SQL
TRIGGERS (componentes)

trigger-name nombre del trigger a ser creado
triggering-event: puede ser INSERT, UPDATE o DELETE
table-name: nombre de la tabla con la cual el trigger est
asociado
for each row: causa el disparo del trigger por cada fila
(opcional)
condition: cuando es TRUE, habilita el trigger para ser
disparado (opcional).
PL/SQL-block: es el bloque de cdigo que se ejecuta cuando
se dispara el trigger.
47
Lenguaje PL/SQL
TRIGGERS (sintaxis)


Activar o desactivar triggers.
ALTER TRIGGER nombre [DISABLE|ENABLE]

Eliminar triggers
DROP TRIGGER nombre

You might also like