Академический Документы
Профессиональный Документы
Культура Документы
1. INTRODUCCIÓN
2. CARACTERÍSTICAS DEL LENGUAJE
1. Introducción
TEMA 12: INTRODUCCIÓN AL LENGUAJE PL/SQL
9 PL/SQL es un lenguaje procedimental diseñado por Oracle
para trabajar con la BD.
9 Está incluido en el servidor y en algunas herramientas de
cliente.
9 Soporta todos los comandos de consulta y manipulación de
datos, aportando al lenguaje SQL las estructuras de control y
otros elementos propios de los lenguajes procedimentales de
3ª generación.
9 Su unidad de trabajo es el bloque, constituido por un conjunto
de declaraciones, instrucciones y mecanismos de gestión de
errores y excepciones.
DECLARE
v_num_emple NUMBER(2);
BEGIN
INSERT INTO Depart VALUES (99,’PROVISIONAL’,NULL);
UPDATE Emple SET DEPT_NO=99 WHERE DEPT_NO=20;
v_num_emple := SQL%ROWCOUNT;
DELETE FROM DEPART WHERE DEPT_NO=20;
DBMS_OUTPUT.PUT_LINE (v_num_emple || ‘ Empleados ubicados en PROVISIONAL’);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR (-20000, ‘Error en la aplicación’);
END;
9 PL/SQL permite declarar una variable del mismo tipo que otra variable o que una
columna de una tabla mediante el atributo %TYPE.
Ejemplo: Declara la variable NombreActual que es del mismo tipo que la columna Nombre de la tabla
Empleados. NombreActual Empleados.Nombre%TYPE;
9 También se puede declarar una variable para guardar una fila completa de una
tabla mediante el atributo %ROWTYPE.
Ejemplo: Declara la variable MiFila, que es del mismo tipo que las filas de la tabla Empleados.
MiFila Empleados%ROWTYPE;
2.2. Definición de datos compatibles con PL / SQL
TEMA 12: INTRODUCCIÓN AL LENGUAJE PL/SQL
2.3.1. Estructuras de control alternativas
Alternativa simple Alternativa doble Alternativa múltiple
IF <condición> THEN IF <condición> THEN IF <condición> THEN
instrucciones; instrucciones; instrucciones;
… … …
END IF; ELSE ELSIF <condición2> THEN
Instrucciones; Instrucciones;
… …
END IF; ELSIF <condición3> THEN
Instrucciones;
…
ELSE
Instrucciones;
…
END IF;
Ejemplo: Añade a la tabla Clientes una fila con los valores contenidos en las
variables que se especifican:
INSERT INTO Clientes VALUES (VNum, VNomb, VLoc);
Ejemplo: Para guardar el resultado de la siguiente consulta en la variable VNumVentas, que deberá
haber sido declarada previamente, emplearemos:
SELECT COUNT(*) INTO VNumVentas FROM Ventas;
Ejemplo: Para guardar el resultado de la siguiente consulta en la variable VNumVentas, que deberá
haber sido declarada previamente, emplearemos:
DECLARE
vApe VARCHAR2(10);
vOficio VARCHAR2(10);
BEGIN
SELECT apellido, oficio INTO vApe, vOficio FROM Emple WHERE emp_no=7900;
DBMS_OUTPUT.PUT_LINE (vApe || ¡ -‘ || vOficio);
END;
9 La última línea del bloque debe ser un punto. Esto provoca que se guarde todo en el
buffer SQL. Una vez guardado, podremos ejecutarlo mediante la orden RUN o usar / en
vez de un punto lo que hará que además de guardarlo lo ejecutará. El bloque del buffer
se puede guardar en un fichero con la orden:
SQL> SAVE nombrefichero [REPLACE]
20000
Procedimiento PL/SQLterminado con éxito
Procedimiento creado
4. OPERADORES
5. FUNCIONES DE SQL
6. SENTENCIA GOTO
7. SUBPROGRAMAS
7.1. PROCEDIMIENTOS
7.2. FUNCIONES
7.3. PARÁMETROS
TEMA 13: FUNDAMENTOS DEL LENGUAJE PL/SQL
1. Tipos de datos básicos
9 Se dispone de los mismos tipos de datos que SQL, además de otros propios:
CHAR(n) VARCHAR2 (n) LONG(n) NUMBER(p,e) BOOLEAN DATE
RAW(n)LONG RAW ROWID
2. Identificadores
9 Pueden tener hasta 30 caracteres, empezando siempre por una letra, que puede ir
seguida por letras, números, el signo de dólar ($) , de almohadilla (#) y el subguión ( _
).
3.3. Constantes
9 Se pueden declara constantes mediante el siguiente formato:
<nombreVariable> CONSTANT <tipo>:= <valor>
Asignación :=
T T F NULL T T T T
F T NULL OR
F F F F F T F NULL
NOT NULL NULL F NULL NULL T NULL NULL
Concatenación ||
Aritméticos + - * / **
4. Operadores
TEMA 13: FUNDAMENTOS DEL LENGUAJE PL/SQL
7.1. Procedimientos
CREATE [OR REPLACE] PROCEDURE nombre [(param [IN | OUT | INOUT] <tipo>) ]
[IS|AS]
BEGIN
<codigo del procedimiento>
[EXCEPTION]
END;
7.2. Funciones
CREATE [OR REPLACE] FUNCTION nombre [(param [IN | OUT | INOUT] <tipo>)]
RETURN tipo
[IS|AS]
BEGIN
<codigo de la funcion>
RETURN <valor o expresión>
[EXCEPTION]
END;
9 La cláusula RETURN de la cabecera especifica el tipo del valor que retorna la función. En el cuerpo
del programa se hará efectivo ese retorno utilizando RETURN junto con la expresión cuyo valor se
devolverá o con el valor en sí.
9 Esta cláusula devuelve el control al programa que llamó a la función, asignando el valor devuelto por
la función al identificador de la misma en el punto de la llamada.
7. Subprogramas
TEMA 13: FUNDAMENTOS DEL LENGUAJE PL/SQL
7.3. Parámetros
9 Los subprogramas utilizan parámetros para pasar y recibir información.
9 Hay 2 clases:
7. Subprogramas
TEMA 13: FUNDAMENTOS DEL LENGUAJE PL/SQL
7.3. Parámetros
9 Los parámetros pueden ser de Entrada, Salida o de E/S.
7. Subprogramas
PROGRAMACIÓN EN L4G Y HERRAMIENTAS CASE
1. CURSORES EXPLÍCITOS
4. CURSOR FOR...LOOP
6. EXCEPCIONES
6.1. EXCEPCIONES INTERNAS PREDEFINIDAS
6.2. EXCEPCIONES PREDEFINIDAS POR EL USUARIO
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
9 Se usan para trabajar con consultas que pueden devolver más de una fila.
Hay 4 operaciones básicas para trabajar con un cursor explícito:
2. Apertura del cursor: en la zona de instrucciones hay que abrir el cursor con el siguiente
formato:
OPEN <nombreCursor>;
9 Después del INTO figurará una variable que recogerá la información de todas las
columnas.
1. Cursores explícitos
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
Ejemplo:
DECLARE
CURSOR C1 IS SELECT NOMBRE, APELLIDO
FROM ARBITRO;
Vnom VARCHAR2(15);
Vapel VARCHAR2 (20;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO vNom, vApel;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( vNom || ‘ ‘ || vApel);
END LOOP;
CLOSE C1;
END;
1. Cursores explícitos
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
9 Para conocer detalles respecto a l situación del cursor hay 4 atributos:
Ejemplo:
DECLARE
CURSOR C1 IS SELECT Nombre FROM Futbolista WHERE CodEq= ‘E1’;
Vnom VARCHAR2(15);
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO vNom;
DBMS_OUTPUT.PUT_LINE (C1%ROWCOUNT|| vNom);
EXIT WHEN C1%NOTFOUND;
END LOOP;
CLOSE C1;
END;
9 El trabajo con un cursor consiste en: declarar un cursor, declarar una variables
que recogerá los datos del cursor; abrir el cursor; recuperar con FETCH una a
una las filas extraídas, introduciendo los datos en las variables, procesándolos
y comprobando también si se han recuperado datos o no, y Cerrar el cursor.
4. Cursor FOR...LOOP
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
Ejemplo:
DECLARE
CURSOR C2 IS SELECT nombre, peso, estatura FROM Futbolista
WHERE salario > 1800;
BEGIN
FOR vReg IN C2 LOOP
DBMS_OUTPUT.PUT_LINE (vreg.Nombre ||’ – ‘ || vreg.Peso ||’ –
‘ || vreg.Estatura);
END LOOP;
END;
4. Cursor FOR...LOOP
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
9 Oracle abre implícitamente un cursor cuando procesa un comando SQL que no esté
asociado a un cursor explícito. El cursor implícito se llama SQL y supone también de los
4 atributos mencionados, que pueden facilitarnos información sobre la ejecución de los
comandos SELECT INTO, INSERT, UPDATE y DELETE.
9 El valor de los atributos del cursor SQL se refiere en cada momento a la última orden
SQL.
- SQL%NOTFOUND: dará true si el último INSERT, UPDATE, DELETE O SELECT
INTO han fallado (no han afectado a ninguna fila).
- SQL%FOUND: dará true si el último INSERT, UPDATE, DELTE o SELECT INTO
han afectado a una o más filas.
- SQL%ROWCOUNT: devuelve el nº de filas afectadas por el último INSERT, UPDATE,
DELETE o SELECT INTO.
- SQL%ISOPEN: siempre devolverá falso ya que Oracle cierra automáticamente el cursor
después de cada orden SQL.
Ejemplo:
DECLARE
vDpto Departamentos.Nombre%TYPE;
vLoc Departamentos.Localidad%TYPE;
BEGIN
vDpto := ‘MARKETING’; /* No existe Marketing */
UPDATE Departmentos SET Localidad=’Madrid’ WHERE Nombre= vDpto; /*
Fallará*/
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE (‘Error en la aplicación’);
END IF;
DBMS_OUTPUT.PUT_LINE (‘continua el programa’);
SELECT localidad INTO VLoc FROM Departamentos WHERE
Nombre=vDpto;/*Fallará*/
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE (‘Imposible nunca pasará por aquí’);
END IF;
END;
Ejemplo:
BEGIN
…
SELECT MAX(salario) INTO vmax
FROM Emple WHERE NumDpto := VDpto; /* Nunca levantará NO_DATA_FOUND
*/
IF SQL%NOTFOUND THEN /* Nunca sera cierto */
… /* Nunca se ejecutará */
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN …. /* No sera invocado*/
END;
6. Excepciones
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
Código error Oracle Valor SQL CODE Excepción Se disparan cuando…
ORA-01001 -1001 INVALID_CURSOR Se intenta realizar una operación no
permitida sobre un cursor (por
ejemplo, cerrar un cursor que no se
ha abierto)
6. Excepciones
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
Código error Oracle Valor SQL CODE Excepción Se disparan cuando…
ORA-01422 -1422 TO_MANY_ROWS
6. Excepciones
TEMA 14: CURSORES Y EXCEPCIONES EN PL/SQL
Ejemplo: El siguiente ejemplo utiliza una excepción predefinida y otra definida por el
programador:
6. Excepciones
PROGRAMACIÓN EN L4G Y HERRAMIENTAS CASE
TEMA 15: TRIGGERS EN PL/SQL
1. INTRODUCCIÓN
2. DECLARACIÓN DE TRIGGERS
1. Introducción
TEMA 15: TRIGGERS EN PL/SQL
CREATE [OR REPLACE] TRIGGER <nombre_trigger>
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]}
ON <nombre_tabla>
[FOR EACH ROW [WHEN (<condicion>)] | FOR EACH STATEMENT]
DECLARE
/* variables locales*/
BEGIN
[EXCEPTION <gestión de excepciones>]
END <nombre_trigger>;
El disparador insertará una fila en la tabla auditaraemple con el texto ‘SUBIDA SALARIO
EMPLEADO’ y el número del empleado al que se le ha subido el salario.
Ejemplo: Crear el trigger audit_borrado_emple que se disparará cada vez que se borre un
empleado, guardando su número, apellido y departamento en una fila de la tabla
AUDITARAEMPLE:
FOR EACH ROW Los disparadores con nivel de fila se activan una vez por
cada fila afectada por la orden que provocó el disparo. Los
disparadores con nivel de orden se activan sólo una vez,
antes o después de la orden. Los disparadores con nivel de
fila se identifican por la cláusula FOR EACH ROW en la
definición del disparador.
2. Declaración de triggers
TEMA 15: TRIGGERS EN PL/SQL
9 La cláusula WHEN sólo es válida para los disparadores con nivel de fila.
9 Dentro del ámbito de un trigger disponemos de las variables OLD y NEW. Estas
variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la
salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una
copia del registro antes (OLD) y después (NEW) de la acción SQL (INSERT, UPDATE,
DELETE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder a los
datos que se están insertando, actualizando o borrando.
El trigger se ejecutará cuando sobre la tabla PRODUCTOS se ejecute una sentencia INSERT.
INSERT INTO PRODUCTOS (COD_PRODUCTO,
DESCRIPCION,LINEA_PRODUCTO,PRECIO_UNI,STOCK) VALUES
('10','TORNILLO','PROCES',500,0);
2. Declaración de triggers
TEMA 15: TRIGGERS EN PL/SQL
9 Una misma tabla puede tener varios triggers. En tal caso es necesario
conocer el orden en el que se van a ejecutar.
INSERT No definido; todos los campos toman Valores que serán insertados
valor NULL. cuando se complete la orden.
UPDATE Valores originales de la fila, antes de Nuevos valores que serán escritos
la actualización. cuando se complete la orden.
DELETE Valores, antes del borrado de la fila. No definidos; todos los campos
toman el valor NULL.
9Los registros OLD y NEW son sólo válidos dentro de los disparadores con nivel
de fila.
5. Utilización de :OLD y :NEW
TEMA 15: TRIGGERS EN PL/SQL
9 Dentro de un disparador en el que se disparan distintos tipos de órdenes
DML (INSERT, UPDATE y DELETE), hay tres funciones booleanas que
pueden emplearse para determinar de qué operación se trata. Estos
predicados son INSERTING, UPDATING y DELETING.
9 Su comportamiento es el siguiente:
PREDICADO COMPORTAMIENTO