Académique Documents
Professionnel Documents
Culture Documents
Bloques PL/SQL
Introduccin
Variables
Procedimientos
Funciones
Excepciones
Estructuras de control
ETSISI
PL/SQL, Introduccin
PL/SQL:
Es un lenguaje de programacin estructurado de
ORACLE que amplia el SQL estndar:
Permite:
Manipular datos de una BD Oracle
Crear procedimientos estructurados:
Usando tcnicas de programacin como bucles
For, While, etc.
Controlar errores con excepciones definidas
por el usuario o propias de Oracle
Controlar las filas de una consulta una a una
Crear disparadores/ triggers
ETSISI
PL/SQL, Introduccin
PL/SQL:
Es un lenguaje de programacin procedural
estructurado en bloques
Los programas se pueden dividir en bloques lgicos.
Permite bloques anidados.
Puede declarar variables localmente al bloque que las
utiliza.
ETSISI
PL/SQL, Bloques
Se distingue entre bloques:
Compilados y guardados
Subprogramas: procedimientos, paquetes, funciones:
Se compilan y guardan en la BD
Se ejecutan mediante llamadas explicitas.
PL/SQL, Bloques
Bloque: es la unidad ms pequea de un programa
PL/SQL.
Estructura de bloque:
Cada estructura PL/SQL comprende uno o ms
bloques. stos pueden estar separados o anidados
[DECLARE]
........
BEGIN
......
[EXCEPTION]
........
END;
ETSISI
PL/SQL, Bloques
DECLARE (No es obligatoria)
Debe de contener todas las constantes, variables y
excepciones definidas por el usuario y que se referencian
a lo largo de las siguientes secciones.
BEGIN
Seccin obligatoria, parte ejecutable, contiene las
sentencias SQL para manipular datos de la BD y
sentencias PL/SQL para manipular datos del bloque.
EXCEPTION
Seccin no obligatoria, controla los errores de ejecucin,
ofrece una salida controlada a las condiciones anormales
de la seccin ejecutable.
END; (Obligatorio, cierra el bloque)
ETSISI
BLOQUES, Anidamiento
BEGIN
DECLARE
Var X
...............
BEGIN
DECLARE
Var Y
............
BEGIN
...........
EXCEPTION
..............
END;
...........
EXCEPTION
..............
END;
END;
mbito de la
variable Y
mbito de la
variable X
ETSISI
PL/SQL, Bloques
Bloques Annimos
DECLARE
Sentencias
EXCEPTION
Control de errores
END; obligatorio
ETSISI
PL/SQL
Bloques PL/SQL
Introduccin
Variables
Procedimientos
Funciones
Excepciones
Estructuras de control
ETSISI
Variables PL/SQL
ETSISI
ETSISI
ETSISI
ETSISI
secuencia )
Concepcin M. Gascuea
14
ETSISI
dic-15
ETSISI
MINVALUE p;
Borrar una secuencia
DROP SEQUENCE seq_nombre;
dic-15
ETSISI
Ejemplo:
Var_inventario Number(7,2);
Var_ media_inventario Var_inventario.%TYPE:=0;
La variable Var_inventario debe de existir
ETSISI
proveedores.CODPROV%TYPE;
tabla%ROWTYPE;
Ejemplo
RegistroAlmacen Almacen%ROWTYPE;
ETSISI
ETSISI
ETSISI
Descripcin
To_Number(argumento)
To_Char(argumento)
To_Date(argumento)
ETSISI
31)
ETSISI
SELECT *
FROM Alumno
WHERE Ciudad =&ciud;
SELECT &colum, Nombre
FROM Alumno
WHERE Cod_matricula =&cod_ma;
SELECT &codgru, Ciudad
FROM Alumno
WHERE &condicion;
ETSISI
ETSISI
ETSISI
ETSISI
PL/SQL
Bloques PL/SQL
Introduccin
Variables
Procedimientos
Funciones
Excepciones
Estructuras de control
ETSISI
PL/SQL, Bloques
Estructura de Bloque en Subprogramas PL/SQL
ETSISI
PL/SQL, Procedimientos
Subprogramas, programas compilados y
guardados en la BD.
Mejoran el Mantenimiento
Mejoran la Seguridad e Integridad de los
datos
Mejoran el Rendimiento
ETSISI
PL/SQL, Programas
REGLAS
Acabar los procedimientos creados directamente en SQL
con un punto para salir de las sentencias, despus/
EXECUTE Nombre_Procedimiento; (ejecuta el
procedimiento)
PL/SQL, Procedimientos
CREATE OR REPLACE PROCEDURE
Nombre_Procedure (parametros no obligatorios)
IS
........
BEGIN
...............
EXCEPTION
----END Nombre_Procedure;
ETSISI
PL/SQL, Procedimientos
Ejemplo Dada la tabla prueba:
PRUEBA ( cod_prueba Number(3),Fecha Date,
Primary key (cod_prueba ));
Crear un bloque Annimo, directamente en SQL con lo
siguiente:
DECLARE
BEGIN
INSERT INTO PRUEBA VALUES (1,SYSDATE);
END;
Se crea compila y ejecuta si no tiene errores de sintaxis
Comprobar que se ha ejecutado correctamente con
SELECT * FROM PRUEBA;
ETSISI
PL/SQL, Procedimientos
Ejemplo:
Crear un procedimiento que al llamarlo inserte valores
(nmero secuencial, usuario conectado y fecha del
sistema) en la tabla Usuarioconex.
Crear previamente una tabla que recoja el usuario y la
fecha de conexin.
numero NUMBER(3),
usuario VARCHAR2 (10),
fecha DATE,
Primary key (numero ));
CREATE SEQUENCE SEC_USER;
ETSISI
PL/SQL, Procedimientos
Procedimiento que al llamarlo inserte valores (nmero secuencial,
usuario conectado y fecha del sistema) en la tabla Usuarioconex.
PL/SQL, Procedimientos
Ejemplo: Crear un procedimiento que inserte un registro en la
tabla Almacenes
Procedimientos y Funciones
Borrar procedimientos y funciones
ETSISI
PL/SQL
Bloques PL/SQL
Introduccin
Variables
Procedimientos
Funciones
Excepciones
Estructuras de control
ETSISI
PL/SQL, Funciones
Las funciones devuelven siempre un valor que hay que
recoger en una variable.
Solo se introducen los argumentos de entrada.
Ejemplo
Crear una funcin PRECIOTOTAL que devuelva la
suma de los precios de los artculos de un determinado
proveedor de la tabla POVEEDORES, el cual se
introducir por argumento.
ETSISI
PL/SQL, Funciones
CREATE OR REPLACE FUNCTION F_preciototal
(cod IN proveedores.codprov%type)
RETURN NUMBER IS
tot number;
BEGIN
SELECT Sum(precio) INTO tot
FROM proveedores, articulos
WHERE codprov= cod
AND codprov=pro_codprov;
RETURN (tot);
END F_preciototal; ./
(compilar sin errores o corregir stos con Show errors)
ETSISI
PL/SQL, Funciones
EJECUTAR LA FUNCIN
Crear una variable de enlace de tipo Number, en el
SQL PLUS:
VARIABLE VAR1 NUMBER;
Ejecutar la funcin
EXECUTE :VAR1:=F_preciototal(103);
Avisa:
Procedimiento PL/SQL terminado con xito.
Imprimir por pantalla el valor de la funcin
PRINT :VAR1;
ETSISI
PL/SQL
Bloques PL/SQL
Introduccin
Variables
Procedimientos
Funciones
Excepciones
Estructuras de control
ETSISI
PL/SQL, Excepciones
Excepciones:
Una excepcin se produce cuando ocurre un error en
un programa PL/SQL
Ocurre un error se lanza una excepcin
Si est controlada por el programa se trata en la zona de
Excepciones del bloque PL/SQL.
Si no est controlada el programa se detiene.
PL/SQL, Excepciones
Excepciones predefinidas por Oracle
Ejemplo
DECLARE
.
BEGIN
..
EXCEPTION
WHEN NO_DATA_FOUND THEN
sentencias que quiero realizar
END
ETSISI
PL/SQL, Excepciones
Excepciones definidas por el usuario
Ejemplo
DECLARE
Se declara la
User_exception EXCEPTION;
excepcin
BEGIN
If var>8 then RAISE User_exception
..
EXCEPTION
WHEN User_exception THEN
Rollback;
DBMS_OUTPUT.PUT(Mensaje);
Se produce el error y se
genera la excepcin con
RAISE
Se trata la excepcin
ETSISI
PL/SQL, Excepciones
Mensajes de error cuando se provoca una excepcin:
DBMS_OUTPUT.put_line(Mensaje aviso al usuario)
ETSISI
PL/SQL, Excepciones
La excepcin Other
WHEN OTHERS THEN
Rutina especial que se ejecuta para todas las excepciones no
tratadas con anterioridad en la zona EXCEPTION. Debe de
ir la ltima dentro de ella
Con SQLCODE se recupera el cdigo de error contemplado
por Oracle que provoda la excepcin
SQLERRM permite recuperar el texto asociado al codigo
de error actual que ha provocado la excepcin.
Por ejemplo
DBMS_OUTPUT.put_line('Error'||SQLCODE||SQLERRM)
ETSISI
PL/SQL, Excepciones
Ejemplo 1
CREATE FUNCTION divide(dividendo NUMBER, divisor
NUMBER) IS Return Number;
DECLARE
resul Number;
BEGIN
resul=dividendo/divisor;
EXCEPTION
WHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero)
DBMS_OUTPUT.PUT_LINE(No puedes dividir por cero);
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, Hay un error no definido');
END;
ETSISI
PL/SQL, Excepciones
Ejemplo 2
CREATE FUNCTION divide(dividendo NUMBER, divisor
NUMBER) IS Return Number;
DECLARE
resul Number;
errNum Number;
BEGIN
resul=dividendo/divisor;
EXCEPTION
WHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero)
DBMS_OUTPUT.PUT_LINE(No puedes dividir por cero);
WHEN OTHERS THEN
errNum := SQLCODE; /*NUMERO DE ERROR DE sql*/
RAISE_APPLICATION_ERROR(-20000, errNum);
END;
ETSISI
PL/SQL, Excepciones
Algunas excepciones predefinidas por Oracle
DUP_VAL_ON_INDEX
Esta excepcin se crea cuando se intenta almacenar un
valor duplicado en la clave primaria o en una columna con
restriccin UNIQUE. SQL_CODE= -1 (ORA-00001)
INVALID_NUMBER
En una sentencia SQL, una cadena de caracteres no
representa un nmero vlido. SQL_CODE= -1722
NO_DATA_FOUND
No se encuentran valores en alguna accin SQL pedida.
SQL_CODE= 100
ETSISI
PL/SQL, Excepciones
Algunas excepciones predefinidas por Oracle
TOO_MANY_ROWS
Una sentencia SELECT INTO devuelve ms de una fila.
SQL_CODE= -1422
ZERO_DIVIDE THEN
Se ejecuta cuando se intenta dividir por cero. SQL_CODE=
-1476
VALUE_ERROR
Ocurre un error aritmtico, de conversin o truncamiento.
Por ejemplo cuando se intenta introducir un valor mayor que
el tamao de la variable SQL_CODE= -6502
ETSISI
PL/SQL
Bloques PL/SQL
Introduccin
Variables
Procedimientos
Funciones
Excepciones
Estructuras de control
ETSISI
ETSISI
ELSE sentencias 2
END IF;
IF <condicin 1> THEN sentencias 1
ELSIF <condicin 2> THEN sentencias 2;
END IF;
ETSISI
ETSISI
FOR i IN 1..4
LOOP
INSERT INTO USUARIOCONEX VALUES
(SEC_USER.NEXTVAL, USER, SYSDATE);
END LOOP;
END;
ETSISI
Sentencia 1;
..
Sentencia n;
END LOOP;
La condicin es evaluada en cada iteracin y mientras
sea TRUE, se ejecutan las sentencias reiteradamente.
ETSISI
ETSISI
ETSISI
create or replace
PROCEDURE XXXXXXX as
ide SE.id_e% TYPE;
cantidad integer;
CURSOR cursor_1 IS SELECT Id_E , COUNT(*) as cantidad
FROM SE
GROUP BY Id_E
HAVING COUNT(*) = (
SELECT NE FROM E
WHERE E.id_E = SE.Id_E
);
fila cursor_1%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Resultado de la consulta');
OPEN cursor_1;
LOOP
FETCH cursor_1 INTO fila;
EXIT WHEN cursor_1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Id= '|| to_Char(fila.Id_E)||' cantidad= '||to_Char(fila.cantidad));
END LOOP;
CLOSE cursor_1;
END XXXXXXX;
ETSISI
ETSISI