Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Completo PDF
Completo PDF
- Mejorar el mantenimiento.
- Mejorar la seguridad e integridad de los datos.
- Mejorar el rendimiento.
2. DECLARACIN DE VARIABLES
2.1.- Introduccin.
2.2.- Uso de variables en PL/SQL.
2.3.- Tipos de variables.
2.1.- INTRODUCCIN
[DECLARE] Opcional
BEGIN Obligatorio
Sentencias SQL.
Sentencias de control PL/SQL.
[EXCEPTION] Opcional
END; - Obligatorio
Estos bloques se suelen almacenar en scripts, al igual que los informes, para luego
ejecutarlos. Un bloque PL se puede dividir en bloques lgicos o declarativos (declare),
ejecutables (begin) y de excepciones (exception):
1 Seccin Declarativa
2 Seccin Ejecutable
ANNIMOS SUBPROGRAMAS
- Bloques annimos: son bloques sin nombrar. Son declarados en una aplicacin en la que
se van a ejecutar y se transfieren al motor PL/SQL para que se ejecuten al momento.
- Subprogramas: son bloques PL/SQL especificados que pueden tomar parmetros y
pueden ser invocados. Puede declararlos como procedimientos o como funciones.
Generalmente se usan los procedimientos para ejecutar una accin y una funcin para
calcular un valor.
Variables PL/SQL:
Escalares: Contienen un valor nico. Los principales tipos de datos son los
que corresponden a tipos de columnas en las tablas del servidor Oracle8;
PL/SQL tambin soporta variables booleanas.
Compuestas: Hacen referencia a tipos de datos compuestos, como los
registros y las tablas.
Referenciada: o punteros, que designan otros artculos del programa.
LOB: Especifican imgenes o cualquier conjunto de caracteres o bytes que
tengan una longitud excesiva.
Enlace o Bind.
Host.
Sintaxis:
Dnde:
NOT NULL: restringe la variable. La obliga a contener algn valor. Las NOT NULL
tambin se deben inicializar.
EXPR: Cualquier expresin PL/SQL, pudiendo ser un literal, otra variable, etc.
Ejemplos:
Recomendaciones a seguir
- Dos variables pueden tener el mismo nombre si estn en dos bloques diferentes.
- El nombre de la variable (identificador) no debe ser el mismo que el de una
columna de una tabla utilizada en el bloque.
- Se puede asignar cualquier valor a una variable simplemente nb_var:=expresion;
- Se pueden usar las funciones TO_NUMBER, TO_DATE y TO_CHAR.
DBMS_OUTPUT.PUT_LINE(<expresion>);
SET SERVEROUTPUT ON
Ejemplo 2:
DECLARE
V_TEXTO VARCHAR2(20):=HOLA MUNDO;
BEGIN
DBMS_OUTPUT.PUT_LINE(V_TEXTO);
END;
/
EL ATRIBUTO %TYPE:
Ejemplo
v_ename emp.ename%TYPE;
v_ename adopta el tipo de dato de emp.ename.
v_balance number(7,2);
v_balance se le asigna el tipo number de 7,2
v_min_val v_balance%TYPE;
v_min_val adopta el tipo number(7,2) como v_balance
VARIABLES PL/SQL
Variables escalares:
Tipos Descripcin
VARCHAR2(n) Para datos tipo carcter de longitud 3270 bytes.
NUMBER[(p,s)] Enteros y decimales.
DATE Fechas y horas.
CHAR(n) Cadenas de longitud fija.
LONG Datos carcter de longitud variable.
LONG RAW Datos binarios y cadenas.
BOOLEAN Utilizada para clculos lgicos, admite TRUE, FALSE y NULL.
Slo pueden estar conectadas por los operadores lgicos
AND, NOT, OR y las expresiones aritmticas de carcter y
fecha que pueden devolver un valor booleano.
BINARY_INTEGER Tipo de base de enteros entre 2147483647 y 2147483647.
- Registros: trata datos relacionados pero no iguales como una unidad lgica.
- Tablas: hacen referencia a colecciones de datos que permiten ser manipulados.
Variables LOB:
VARIABLES NO PL/SQL
Es una variable que declara cualquier usuario y es utilizada despus para transferir
valores bien sean numricos o de caracteres dentro o fuera de uno o ms programas PL.
Host:
3 - SENTENCIAS EJECUTABLES
- Una sentencia puede terminar en una lnea y continuar en la otra si ponemos al final de
toda la sentencia un punto y coma;
- Los identificadores sirven para dar nombre a las unidades y artculos de los programas
PL/SQL. Pueden contener hasta 30 caracteres, no pueden contener palabras
reservadas, deben comenzar por una letra y el nombre de un identificador no es
aconsejable que coincida con el nombre de una columna de una tabla.
- Sintaxis y directrices de los literales: Los nmeros pueden ser simples o ir dentro de
una notacin cientfica. Han de ir entre comillas las fechas y las cadenas.
3.3 OPERADORES
3.4 - FUNCIONES
Funciones Descripcin
ABS(n) Devuelve el valor absoluto de un nmero.
CEIL(n) Devuelve el entero ms pequeo o igual al nmero.
COS(n) Coseno de n.
EXP(n) Nmero e elevado a n.
FLOOR(n) Entero ms grande o igual a n.
LN(n) Devuelve el logaritmo neperiano de n.
LOG(n1,n2) Logaritmo en base n1 de n2.
MOD(n1,n2) Devuelve el resto de dividir n1 entre n2.
POWER(n1,n2) Devuelve n1 elevado a n2.
ROUND(n1,n2) Redondea n1 con n2 decimales.
SVGN(n) Devuelve 1 si el nmero es menor de 0, 0 si es igual a 0 y 1 si es
mayor de 0.
SIN(n) Seno de n.
SQRT(n) Raz cuadrada de n, que ha de ser siempre mayor de 0.
TAN(n) Tangente de n.
TRUNC(n1,n2) Trunca n1 con n2 decimales.
Funciones Descripcin
ASCII(C) Devuelve el ASCII del carcter.
CHR(n) Devuelve el carcter correspondiente al nmero n.
CONCAT (c1, c2) Concatena 2 cadenas.
INITCAP(c) Transforma la primera letra a mayscula.
LENGHT(c) Longitud de la cadena.
LOWER(c) Transforma a minsculas.
LPAD (c1, n, c2) Justifica a la derecha el valor del carcter c1 n posiciones y los
blancos los reemplaza por el carcter c2.
LTRIM(c1, c2) Suprime caracteres a la izquierda hasta el primer carcter que
no est en c2. Si se omite c2 lo pone todo en blanco.
REPLACE(c1,c2,c3) Devuelve c1 con la cadena c2, reemplazada por c3 y as
sucesivamente.
RPAD(c1,n,c2) Iguala a la derecha.
RTRIM(c1,c2) Igual que LTRIM pero por la derecha.
SUBSTR(c1,m,n) Substrae de la cadena c1, y desde el carcter m, n caracteres.
TRANSLATE(c1,c2,c3) Devuelve la cadena c1 con cada carcter de c2 que contenga
reemplazado por el carcter de c3 con el que se corresponda.
UPPER(c) Convierte c a maysculas.
CONVERSIN
Funciones Descripcin
TO_CHAR(c1,fmt) Convierte un nmero o fecha a cadena de caracteres.
TO_DATE(c1,fmt) Convierte una cadena de caracteres a un nmero.
TO_NUMBER(c1,fmt) Convierte una cadena de caracteres a una fecha.
FECHA
Funciones Descripcin
ADD_MONTH(fecha,n) Agrega meses a una fecha.
LAST_DAY(fecha) ltimo da del mes.
MONTHS_BETWEEN(fecha1,fecha2) Nmero de meses entre dos fechas.
NEXT_DAY(fecha, caracter) Prximo da de la fecha especificada.
DIVERSAS
Funciones Descripcin
DUMP(expr) Devuelve la expresin en el formato interno de Oracle.
GREATEST(lista de valores) Da como resultado el valor ms grande de la lista.
LEAST (lista de valores) Da como resultado el valor ms pequeo de la lista.
NVL(expr1, expr2) Reemplaza los nulos por otro valor.
USER Devuelve al usuario conectado.
USERENV(opcin) Devuelve informacin sobre el usuario. Las opciones
pueden ser:
SESSIONID: Se identifica la sesin.
TERMINAL: Identificador del terminal.
LANGUAGE: Lenguaje activo.
DECODE Realiza la funcin de IF/THEN/ELSE.
Tambin se pueden anidar bloques de forma que las variables tengan su propio
mbito de ejecucin:
DECLARE
X BINARY_INTEGER;
BEGIN
DECLARE
Y BINARY_INTEGER;
BEGIN
...............
EXCEPTION
.........
END;
EXCEPTION
.......
END;
Las sentencias pueden ser anidadas cuando el bloque PL/SQL lo requiera. Un bloque
anidado se convierte en una sentencia. La seccin de excepciones tambin puede contener
bloques, pero generalmente el lugar donde se suele trabajar es en la zona ejecutable. El
mbito de un objeto es la regin de programa que hace referencia a dicho objeto.
Las variables tienen como mbito su propio bloque. En este caso, la variable Y slo
ser reconocida por el segundo bloque, y una vez finalizado este el bloque principal no la
reconocer, por el contrario, la variable X tiene como mbito todo el bloque, ya que tiene
vigencia en su propio bloque y en el bloque anidado, ya que este pertenece al bloque
principal.
- Utilizar maysculas para sentencias SQL*PLUS, para palabras claves de PL/SQL y para
los tipos de datos y minsculas para identificadores, parmetros, columnas y tablas de
la BD.
Si no se quiere escribirlas cada vez que iniciemos una nueva sesin se pueden
escribir en el fichero LOGIN.SQL.
Esta sentencia sirve para recuperar datos de tablas, tal y como haca en
SQL*PLUS.
Sintaxis:
SELECT lista_seleccionada
INTO {nb_variable1 [ , nb_variable2 ] | nb_registro}
FROM nb_tabla
WHERE condicin;
Ejemplo 1:
DECLARE
V_TOTAL NUMBER;
BEGIN
SELECT SUM(SAL) INTO V_TOTAL FROM EMP;
DBMS_OUTPUT.PUT_LINE(V_TOTAL);
END;
/
Ejemplo 2:
DECLARE
V_DEPTNO NUMBER(2);
V_LOC VARCHAR2(15);
BEGIN
SELECT DEPTNO, LOC INTO V_DEPTNO, V_LOC
FROM DEPT
WHERE DNAME=SALES;
DBMS_OUTPUT.PUT_LINE(V_DEPTNO);
DBMS_OUTPUT.PUT_LINE(V_LOC);
END;
/
Ejemplo 1:
DECLARE
V_DEPTNO DEPT.DEPTNO%TYPE;
BEGIN
SELECT DEPTNO_SEQUENCE.NEXTVAL INTO V_DEPTNO
FROM DUAL;
INSERT INTO DEPT(DEPTNO, DNAME, LOC)
VALUES (V_DEPTNO,'PUBLICIDAD, MADRID);
END;
/
Ejemplo 2:
DECLARE
V_DEPTNO DEPT.DEPTNO%TYPE:= 50;
BEGIN
DELETE FROM DEPT WHERE DEPTNO= V_DEPTNO;
END;
/
Los errores de sintaxis pueden surgir porque PL/SQL comprueba primero el nombre
de la variable PL/SQL y luego el de la tabla.
Cada vez que se crea una sentencia SQL el servidor Oracle abre un rea de
memoria en la que se analiza y ejecuta el comando. Este rea de memoria es lo que se
conoce con el nombre de cursor. Un cursor es un rea de trabajo privada de SQL. Pueden
ser de los siguientes tipos:
IMPLCITOS: Son los que ya tiene el servidor Oracle. Los utiliza el servidor para
analizar y ejecutar las sentencias SQL son:
Tipos Descripcin
SQL%ROWCOUNT Cuenta el nmero de filas afectadas por la
sentencia SQL ms reciente. Sirve para que nos
cuente el nmero de filas que hemos leido del
cursor.
SQL%FOUND Atributo booleano que da como resultado TRUE si la
sentencia SQL afecta a alguna fila. Sirve para saber
si el cursor tiene ms datos o por el contrario ya los
ha ledo todos.
SQL%NOTFOUND Igual que el anterior pero da TRUE si la sentencia
SQL no afecta a ninguna fila.
SQL%ISOPEN Siempre es FALSE porque SQL cierra los cursores
implcitos inmediatamente despus de ejecutarlos.
Ejemplo:
DECLARE
V_ELIMI NUMBER:=30;
BEGIN
DELETE DEPT WHERE DEPTNO>V_ELIMI;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT|| FILAS ELIMINADAS);
END;
/
5 ESTRUCTURAS DE CONTROL
5.1 Introduccin.
5.2 Control condicional IF.
5.3 Estructuras repetitivas.
5.1 INTRODUCCIN
Como cualquier lenguaje procedural, PL/SQL dispone de una serie de rdenes que
nos permiten establecer controles y condiciones a los programas, pudindose por tanto
representarlos mediante operaciones secuenciales, selectivas y repetitivas. Las dos ltimas
se apoyan en condiciones para establecer su comportamiento.
IF condicin THEN
rdenes;
END IF;
Ejemplo 1:
IF V_MATRI<12000 THEN
UPDATE ALUMNOS
SET MATRCULA=12500
WHERE COD=10;
END IF;
La sintaxis para una condicional doble del tipo IF-THEN-ELSE sera la siguiente:
IF condicin THEN
rdenes;
ELSE
rdenes;
END IF;
Ejemplo 2:
Si en la variable renta tenemos una cantidad, que es el total de las matriculas del
curso 3, podramos montar una estructura como esta para saber si el rentable o no
suponiendo que la rentabilidad est por encima del milln de Ptas.
SELECT SUM(MATRICULA) INTO RENTA
FROM ALUMNOS
WHERE CODIGO_CURSO=3;
IF RENTA > 1000000 THEN
INSERT INTO TEMP(COL3) VALUES (RENTABLE);
ELSE
INSERT INTO TEMP(COL3) VALUES (NO RENTABLE);
END IF;
Cuando sea posible, se utilizar la clusula ELSIF en lugar de anidar tantas veces
las sentencia IF. El cdigo es ms fcil de leer y de entender y la lgica est claramente
definida. Si la accin de la clusula ELSE nicamente consiste en otra sentencia IF, es
preferible utilizar la sentencia ELSIF.
Sintaxis:
IF condicin THEN
rdenes;
ELSIF condicin2 THEN
rdenes;
ELSE
rdenes;
END IF;
LOOP BSICO.
WHILE.
FOR.
BUCLE LOOP
Sintaxis:
LOOP
rdenes;
EXIT [WHEN condicin];
END LOOP;
Ejemplo 1:
Insertar en la tabla ITEM, diez registros, se saldr del bucle cuando se hayan
insertado esos registros.
...
LOOP
INSERT INTO ITEM(ORDER, ITEMID) VALUES (V_ORDER, V_ITEMID);
V_COUNTER:=V_COUNTER+1;
EXIT WHEN V_COUNTER>10;
END LOOP;
BUCLE WHILE
Nos permite asociar una determinada condicin a la hora de ejecutar una serie de
comandos. Se utiliza WHILE mientras la condicin sea cierta.
Sintaxis:
Ejemplo 2:
Disear un bucle WHILE que sume uno a una variable, mientras que esta sea menor
o igual que 100.
WHILE V_X<=100 LOOP
V_X:=V_X+1;
END LOOP;
BUCLE FOR
Sintaxis:
Ejemplo 3:
...
V_ORDID ITEM.ORDID%TYPE := 101;
BEGIN
FOR I IN 1..10 LOOP
INSERT INTO ITEM(ORDID, ITEMID)
VALUES (V_ORDID,I);
END LOOP;
6. REGISTROS Y TABLAS:
6.1.- Introduccin.
6.2.- Registros.
6.3.- Atributo %ROWTYPE.
6.4.- Tablas.
6.1.- INTRODUCCIN
6.2.- REGISTROS
Sintaxis:
nb_reg nb_tipo_reg;
Nb_campo {tip_dato_campo|variable%TYPE|tabla.column%TYPE|tabla%ROWTYPE}
[[NOT NULL]{:= | DEFAULT} expr ]
Donde:
Ejemplo 1:
ALUMNO REG_ALUMNO;
Ejemplo 2:
DEPARTAMENTO REG_DEPT;
Ejemplo 3:
DECLARE
CURSOR C1 IS
SELECT DEPTNO, DNAME
FROM DEPT
ORDER BY DEPTNO;
REG REGISTRO;
V_NUM NUMBER:=&NUMERO_FILA;
BEGIN
OPEN C1;
FETCH C1 INTO REG;
WHILE (C1%ROWCOUNT<=V_NUM) AND (C1%FOUND)LOOP
DBMS_OUTPUT.PUT_LINE (REG.DEPTNO || ||REG.DNAME);
FETCH C1 INTO REG;
END LOOP;
CLOSE C1;
END;
/
Los campos del registro tomarn automticamente sus nombres y tipos de datos de
la columna de la tabla, vista o cursor. El registro almacena por tanto, una fila entera de los
elementos.
Sintaxis:
Nb_registro objeto_referenciado%ROWTYPE;
Ejemplo:
DECLARE
CURSOR C1 IS
SELECT * FROM DEPT
ORDER BY DEPTNO;
REG C1%ROWTYPE;
BEGIN
OPEN C1;
FETCH C1 INTO REG;
WHILE (C1%ROWCOUNT <= V_NUM) AND (C1%FOUND) LOOP
DBMS_OUTPUT.PUT_LINE (REG.DEPTNO|| ||REG.DNAME||
||REG.LOC);
FETCH C1 INTO REG;
END LOOP;
CLOSE C1;
END;
/
Sintaxis:
nb_tabla nb_tipo_tabla;
Ejemplo:
DECLARE
CURSOR C1 IS
SELECT ENAME, SAL FROM EMP
ORDER BY SAL;
V_ENAME EMP.ENAME%TYPE;
V_SAL EMP.SAL%TYPE;
I BINARY_INTEGER:=0;
V_NUM NUMBER:=&NUM_FILAS;
BEGIN
OPEN C1;
FETCH C1 INTO V_ENAME, V_SAL;
WHILE (C1%ROWCOUNT <= V_NUM) AND (C1%FOUND) LOOP
I:= I+1;
E_TABLA(I):=V_ENAME;
S_TABLA(I):=V_SAL;
FETCH C1 INTO V_ENAME, V_SAL;
END LOOP;
CLOSE C1;
FOR I IN 1..V_NUM LOOP
DBMS_OUTPUT.PUT_LINE (E_TABLA(I));
DBMS_OUTPUT.PUT_LINE (S_TABLA(I));
END LOOP;
END;
/
Puesto que slo se necesita una definicin de tabla para almacenar informacin
acerca de todos los campos de una tabla de la base de datos, la tabla de registros aumenta
en gran medida la funcionalidad de las tablas PL/SQL.
Para crear una tabla de registros hay que seguir las siguientes pautas:
Nb_tabla nb_tipo_tabla;
7. CURSORES EXPLCITOS.
7.1.- Introduccin.
7.2.- Declaracin de cursores.
7.3.- Abrir cursores.
7.4.- Recogida de datos de cursores.
7.5.- Cerrar un cursor.
7.6.- Atributos de cursores explcitos.
7.7.- Bucles FOR de cursor
7.1.- INTRODUCCIN:
Los cursores se utilizan para trabajar con consultas que devuelven ms de una fila.
Todas las sentencias SQL ejecutadas por el servidor tienen un cursor asociado, bien
implcito declarado para sentencias DML y PL/SQL SELECT.
Existen otros tipos de cursores explcitos, que son creados por el programador y
especifican el rea de memoria que debe reservar el servidor. Estos ltimos sern motivo
de estudio de este tema.
Sintaxis:
CURSOR nb_cursor IS
sentencia SELECT;
Una vez declarado el cursor procedemos a abrirlo, para ello se usa la orden OPEN,
que presenta la siguiente sintaxis :
OPEN nb_cursor;
Sintaxis:
La sentencia FETCH recupera las filas del juego de resultados de una en una.
Despus de cada recuperacin, el cursor avanza a la siguiente fila del juego de resultados.
Directrices:
Sintaxis:
CLOSE nb_cursor;
Ejemplo 1:
DECLARE
CURSOR MATRI IS
SELECT MATRICULA, BECARIO FROM ALUMNOS;
TEMPORAL MATRI%ROWTYPE;
VAR1 ALUMNOS.MATRICULA%TYPE;
VAR2 ALUMNOS.MATRICULA%TYPE;
BEGIN
OPEN MATRI;
LOOP
FETCH MATRI INTO TEMPORAL;
EXIST WHEN MATRI%NOTFOUND
IF TEMPORAL.BECARIO IS NULL THEN
VAR1 := VAR1 + MATRI.MATRICULA;
ELSE
VAR2:= VAR2 + MATRI.MATRICULA;
END IF
END LOOP;
INSERT INTO TEMP(COL1,COL2) VALUES (VAR1, VAR2);
CLOSE MATRI;
END;
/
Ejemplo 2:
Crear un bloque PL que acepte un nmero como entrada, elija a los empleados
dependiendo del nmero con el sueldo ms alto y los inserte en la tabla OTRA.
DECLARE
CURSOR EMP_CURSOR IS
SELECT ENAME, SAL FROM EMP WHERE SAL IS NOT NULL
ORDER BY SAL;
V_ENAME EMP.ENAME%TYPE;
V_SAL EMP.SAL%TYPE;
V_NUM NUMBER(3) := &NMERO;
BEGIN
OPEN EMP_CURSOR;
FETCH EMP_CURSOR INTO V_ENAME , V_SAL;
WHILE (EMP_CURSOR%ROWCOUNT <= V_NUM ) AND
EMP_CURSOR%FOUND LOOP
INSERT INTO OTRA (ENAME, SALARY)
VALUES (V_ENAME, V_SAL);
FETCH EMP_CURSOR INTO V_ENAME, V_SAL;
END LOOP;
CLOSE EMP_CURSOR;
COMMIT;
END;
/
Un cursor posee una serie de atributos que podemos asociarle, para conocer su
estado en un momento determinado. Son los siguientes:
LOOP
FETCH CURSOR INTO VARIABLE;
EXIT WHEN CURSOR%NOTFOUND;
END LOOP;
LOOP
FETCH CURSOR INTO VARIABLE
IF CURSOR%FOUND THEN
;
ELSE
EXIT;
END IF;
END LOOP;
LOOP
FETCH CURSOR INTO VARIABLE
IF CURSOR%ROWCOUNT = 5
THEN EXIT;
END IF;
END LOOP;
IF CURSOR%ISOPEN THEN
CLOSE CURSOR;
ELSE
OPEN CURSOR;
END IF;
Sintaxis:
Ejemplo:
Recuperar, de uno en uno, todas las lneas de articulo pedido hasta que no queden
mas lneas, utilizando un bucle FOR de cursor.
......
FOR PED_REG IN CURSOR_LIN LOOP
V_TOTAL:=V_TOTAL+(PED_REG.PRECIO*PED_REG.CANTIDAD);
I:=I+1;
TB_PRODUCTOS(I):=PED_REG.PRODUCTO;
TB_TOTAL(I):=V_TOTAL;
END LOOP;
.....
Escribir un bloque PL/SQL que visualice el apellido y la fecha de alta de todos los
empleados de la tabla EMP, ordenados ascendentemente por fecha de alta en la empresa.
Bucle LOOP
DECLARE
CURSOR C_EMP
IS
SELECT ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE;
V_ENAME EMP.ENAME%TYPE;
V_HIREDATE EMP.HIREDATE%TYPE;
BEGIN
OPEN C_EMP;
LOOP
FETCH C_EMP INTO V_ENAME, V_HIREDATE;
EXIT WHEN C_EMP%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (V_ENAME||'*'||V_HIREDATE);
END LOOP;
CLOSE C_EMP;
END;
/
Bucle WHILE
DECLARE
CURSOR C_EMP
IS
SELECT ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE;
V_ENAME EMP.ENAME%TYPE;
V_HIREDATE EMP.HIREDATE%TYPE;
BEGIN
OPEN C_EMP;
FETCH C_EMP INTO V_ENAME, V_HIREDATE;
WHILE C_EMP%FOUND LOOP
DBMS_OUTPUT.PUT_LINE (V_ENAME||'*'||V_HIREDATE);
FETCH C_EMP INTO V_ENAME, V_HIREDATE;
END LOOP;
CLOSE C_EMP;
END;
/
Bucle FOR
DECLARE
CURSOR C_EMP
IS
SELECT ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE;
BEGIN
END;
/
Crear un bloque PL que acepte un nmero como entrada, elija a los empleados
dependiendo del nmero con el sueldo mas alto y los inserte en una tabla llamada OTRA.
DECLARE
CURSOR EMP_CURSOR
IS
SELECT ENAME,SAL
FROM EMP WHERE SAL IS NOT NULL
ORDER BY SAL;
V_ENAME EMP.ENAME%TYPE;
V_SAL EMP.SAL%TYPE;
V_NUM NUMBER(3):=&NUMERO;
BEGIN
OPEN EMP_CURSOR;
FETCH EMP_CURSOR INTO V_ENAME,V_SAL;
WHILE(EMP_CURSOR%ROWCOUNT<=V_NUM) AND EMP_CURSOR%FOUND LOOP
INSERT INTO OTRA (ENAME,SAL) VALUES (V_ENAME,V_SAL);
FETCH EMP_CURSOR INTO V_ENAME,V_SAL;
END LOOP;
CLOSE EMP_CURSOR;
COMMIT;
END;
/
Los parmetros permiten que los valores se transfieran a un cursor cuando ste
est abierto, y se puede abrir varias veces en un bloque, devolviendo un juego activo
distinto cada vez.
Cada parmetro formal de la declaracin del cursor debe tener un parmetro real
correspondiente en la sentencia OPEN. Los distintos tipos de datos del parmetro son los
mismos que los de las variables escalares, pero no se les asigna tamaos. Los nombres de los
parmetros son referenciados en la expresin de la consulta del cursor.
Sintaxis :
CURSOR nb_cursor
[ (nb_parmetro tipo_dato [ { := | DEFAULT } expr ]....)]
[RETURN tipo_return] IS
Sentencia SELECT;
Abre un cursor explcito varias veces con un juego activo distinto cada
vez.
Ejemplo:
DECLARE
CURSOR EJEMPLO (VAR1 NUMBER) IS
SELECT * FROM ALUMNOS WHERE MATRICULA > VAR1;
BEGIN
OPEN EJEMPLO (150000);
END;
FOR UPDATE
Permite:
Sintaxis:
SELECT .....
FROM .....
FOR UPDATE [ OF col_tabla_referenciada][NOWAIT];
Donde:
Ejemplo:
Recuperar los pedidos de importes superiores a 1000$ que se han procesado hoy.
DECLARE
CURSOR C1 IS
SELECT CUSTID, ORDID
FROM ORD
WHERE ORDERDATE = SYSDATE AND TOTAL>1000.00
ORDER BY CUSTID
FOR UPDATE NOWAIT;
Esta clusula se utiliza siempre que se haga referencia a la fila actual de un cursor
explcito, esto permitir realizar actualizaciones y supresiones a la fila que se est
tratando actualmente.
Se incluir la clusula FOR UPDATE en la consulta del cursor para bloquear primero
las filas.
Sintaxis:
Ejemplo:
DECLARE
CURSOR EMP_CURSOR IS
SELECT
FOR UPDATE;
BEGIN
FOR EMP_RECORD IN EMP_CURSOR LOOP
UPDATE
WHERE CURRENT OF EMP_CURSOR;
END LOOP;
COMMIT;
END;
9. GESTIN DE EXCEPCIONES.
9.1.- Introduccin.
9.2.- Excepciones internas de PL/SQL.
9.3.- Excepciones definidas por el usuario.
9.4.- Excepciones asociadas a errores Oracle.
9.5.- Funciones para interrumpir excepciones.
9.6.- Propagacin de excepciones.
9.7.- RAISE_APPLICATION_ERROR
9.1.- INTRODUCCIN
Con las excepciones podemos tratar errores en los mensajes de Oracle. Una
excepcin es un identificador de PL/SQL que surge durante la ejecucin de un bloque y
termina con su cuerpo principal de acciones. Un bloque termina cuando PL provoca una
excepcin.
Sintaxis:
EXCEPTION
WHEN excep1 [ OR excep2 ... ] THEN
ordenes;
[WHEN excep3 [ OR excep4 ] THEN
ordenes;
]
[WHEN OTHERS THEN
ordenes;
]
Donde:
Excepciones Descripcin
NO_DATA_FOUND Se produce cuando una orden del tipo SELECT
INTO no ha devuelto ningn valor.
ZERO_DIVIDE Sucede cuando se produce cuando se divide un
valor por 0.
INVALID_CURSOR Se produce cuando se produce una operacin
ilegal en un cursor.
TOO_MANY_ROWS Se produce cuando una orden SELECT INTO
devuelva ms de una fila.
INVALID_NUMBER Sucede cuando hay un fallo de conversin de una
cadena a un nmero.
DUP_VAL_ON_INDEX Se produce cuando se intenta introducir un
duplicado en una tabla.
LOGIN_DENIED Sucede cuando se introduce un nombre de
usuario o contrasea no valido.
CURSOR_ALREADY_OPEN Se produce cuando se intenta abrir un cursor que
ya est abierto.
STORAGE_ERROR Se produce cuando hay un fallo en memoria.
VALUE_ERROR Se produce cuando hay un error de operacin
aritmtica de conversin, de truncamiento o de
restriccin.
TIMEOUT_ON_RESOURCE Sucede cuando se acaba el tiempo al coger
determinados recursos.
ACCESS_INTO_NULL Se produce cuando se intenta acceder a los
atributos de un objeto no inicializado.
COLLECTION_IS_NULL Se produce cuando se intenta acceder a
elementos de una coleccin no inicializada.
NOT_LOGGED_ON Se produce cuando se intenta acceder a la base
de datos sin estar conectado a Oracle.
PROGRAM_ERROR Sucede si hay un problema interno en la ejecucin
de un programa.
ROWTYPE_MISMATCH Se produce cuando la variable HOST y la variable
PL/SQL pertenecen a tipos incompatibles.
SUBSCRIPT_OUTSIDE_LIMIT Sucede cuando se intenta acceder a una tabla o a
un array con un valor de ndice ilegal.
Ejemplo:
DECLARE
NUM1 NUMBER:=&n1;
NUM2 NUMBER:=&n2;
DIVIDE NUMBER;
BEGIN
DIVIDE:= NUM1/NUM2;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('IMPOSIBLE DIVIDIR POR 0');
END;
/
Para poder utilizar o crear una excepcin definida a nivel a usuario, lo primero que
se debe hacer es declararla en la zona de declaraciones. Siendo su sintaxis en la zona de
excepciones idntica a las anteriores.
nb_excepcin EXCEPTION;
RAISE nb_excepcin;
Ejemplo:
DECLARE
CURSOR C1 IS
SELECT ENAME, COMM
FROM EMP
ORDER BY 2;
V_ENAME EMP.ENAME%TYPE;
V_COM EMP.COMM%TYPE;
I BINARY_INTEGER:= 14;
CONT NUMBER:=0;
ERROR_COMMIS EXCEPTION;
BEGIN
OPEN C1;
FETCH C1 INTO V_ENAME, V_COM;
WHILE (C1%ROWCOUNT <= I) AND (C1%FOUND) LOOP
IF V_COM IS NULL THEN
RAISE ERROR_COMMIS;
END IF;
CONT:= CONT+1;
INSERT INTO OTRA3 VALUES (V_ENAME, V_COM);
FETCH C1 INTO V_ENAME, V_COM;
END LOOP;
CLOSE C1;
EXCEPTION
WHEN ERROR_COMMIS THEN
DBMS_OUTPUT.PUT_LINE (CONT ||' REGISTROS INTODUCIDOS');
END;
/
Nb_excepcin EXCEPTION;
Ejemplo:
DECLARE
ERROR_EXTERNO EXCEPTION;
PRAGMA EXCEPTION_INIT (ERROR_EXTERNO, -1547);
BEGIN
...
EXCEPTION
END;
/
Funciones Descripcin
SQLCODE Devuelve el nmero de error de Oracle de las excepciones
internas. Se le asigna una variable NUMBER. Los valores
DECODE son los siguientes:
Valor Descripcin
0 No se encontr ninguna excepcin.
1 Excepcin definida por el usuario.
+100 Excepcin NO_DATA_FOUND.
N negativo Otro nmero de error del servidor.
Ejemplo 1:
DECLARE
...
V_ERROR_CODE NUMBER;
V_ERROR_MENSAJE VARCHAR2(25);
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
V_ERROR_CODE:= SQLCODE;
V_ERROR_MENSAJE:= SQLERROR;
...
END;
Ejemplo 2:
DECLARE
COD_ERR NUMBER(6);
VNIF VARCHAR2(10);
VNOM VARCHAR2(15);
ERR_BLANCOS EXCEPTION;
NO_HAY_ESPACIO EXCEPTION;
PRAGMA EXCEPTION_INIT(NO_HAY_ESPACIO, -1547);
BEGIN
SELECT COL1, COL2 INTO VNIF, VNOM
FROM TEMP2;
IF SUBSTR(VNOM,1,1)<= THEN
RAISE ERR_BLANCOS;
END IF;
UPDATE CLIENTES SET NOMBRE=VNOM WHERE NIF=VNIF;
EXCEPTION
WHEN ERR_BLANCOS THEN
INSERT INTO TEMP2(COL1) VALUES (ERR BLANCOS);
WHEN NO_HAY_ESPACIO THEN
INSERT INTO TEMP2(COL1) VALUES (ERR TABLESPACE);
WHEN NO_DATA_FOUND THEN
INSERT INTO TEMP2(COL1) VALUES (ERR NO HABIA DATOS);
WHEN TOO_MANY_ROWS THEN
INSERT INTO TEMP2(COL1) VALUES (ERR DEMASIADOS DATOS);
WHEN OTHERS THEN
COD_ERR := SQLCODE;
INSERT INTO TEMP2(COL1) VALUES (COD_ERR);
END;
/
Sin embargo, si hubiese una excepcin en el hijo sta se propaga al padre, hasta que
encuentre un manejador de la misma.
DECLARE
...X
...Y
...
BEGIN
...
...
BEGIN
...
EXCEPTION
...X
...Y
END;
...
EXCEPTION
...
...
END;
/
9.7.- RAISE_APPLICATION_ERROR
Sintaxis:
RAISE_APPLICATION_ERROR(-n_error, mensaje_error);
Ejemplo:
PROCEDURE SUBIR_SUELDO
(NUM_EMPLE NUMBER, INCREMENTO NUMBER)
IS
SALARIO ACTUAL_NUMBER;
BEGIN
SELECT SALARIO INTO SALARIO_ACTUAL
FROM EMPLEADOS
WHERE EMP_NO = NUM_EMPLE;
IF SALARIO_ACTUAL IS NULL THEN
RAISE_APPLICATION_ERROR(-20010, SALARIO NULO);
ELSE
UPDATE EMPLEADOS
SET SUELDO =SALARIO_ACTUAL+ INCREMENTO
WHERE EMP_NO = NUM_EMPLE;
END IF ;
END SUBIR_SUELDO;
10.- PROCEDIMIENTOS
10.1.- Introduccin.
10.2.- Modos de parmetros.
10.3.- Mtodos para pasar parmetros.
10.4.- Ms sobre procedimientos.
10.1.- INTRODUCCIN
Sintaxis:
Donde:
IN OUT IN OUT
Por defecto. Tiene que especificarse. Tiene que especificarse.
Valor que se pasa al Devuelve al entorno de Valor que se pasa al
subprograma. llamada. subprograma. Devuelve al
entorno de llamada.
Parmetro formal constante. Variable no inicializada. Variable inicializada.
Parmetro actual puede ser Tiene que ser una variable. Tiene que ser una variable.
un literal, expresin,
constante o variable
inicializada.
IN
Ejemplo:
OUT
Pasa un valor desde el procedimiento al entorno de llamada. Tiene que ser una
variable.
Ejemplo:
El procedimiento est creado, ahora hay crear unas variables host y ejecutarlo,
puesto que no hay programa principal que llame al procedimiento.
IN OUT
Valor que se pasa al procedimiento y vuelve al entorno de llamada. Tiene que ser una
variable inicializada.
Ejemplo:
Ejemplo:
Programa principal:
BEGIN
AADIR(60);
AADIR(70,DATOS,MADRID);
AADIR (V_LOC=> BARCELONA,V_DEPTNO=> 75);
END;
/
SQL * PLUS
Ejecucin de forma aislada de un EXECUTE nb_procedimiento (parmetros);
procedimiento.
Ejecucin de procedimiento desde Nb_procedimiento (parmetros);
un programa principal.
Borrado de un procedimiento. DROP PROCEDURE nb_procedimiento;
PROCEDURE BUILDER
Ejecucin de forma aislada de un Nb_procedimiento (parmetros);
procedimiento.
Ejecucin de procedimiento desde Nb_procedimiento (parmetros);
un programa principal.
Borrado de un procedimiento. DROP PROCEDURE nb_procedimiento;
11.1.- Introduccin.
11.2.- Ejecucin de funciones.
11.3.- Ms sobre funciones.
11.4.- Procedimientos y funciones.
11.5.- Recursividad.
11.1.- INTRODUCCIN
Una funcin es un bloque nombrado PL/SQL que devuelve un valor, solamente tiene
parmetros de entrada. Est almacenada en la Base de Datos como un objeto de la misma
para repetidas ejecuciones.
Sintaxis:
Donde:
Ejemplo:
Crear una funcin que devuelva el salario de un empleado cuyo cdigo es introducido
como parmetro. La funcin se llamar GET_SAL;
Ejemplo 1:
Disear una funcin que devuelva el nmero de aos comprendidos entre dos
fechas, las cuales son introducidas como parmetros.
Ejemplo 2:
DECLARE
V_RES NUMBER;
BEGIN
V_RES:= FUNC_FECHA (03/12/95, 08/08/99);
DBMS_OUTPUT.PUT_LINE(V_RES);
END;
/
Una funcin de usuario puede ser invocada desde una orden SQL:
Se crea una funcin cuando se quiere calcular un valor, el cual, debe ser devuelto al
entorno de llamada. Una funcin puede contener varios parmetros de entrada pero una
sola salida al programa principal.
1. Mejorar el rendimiento.
2. Mejorar el mantenimiento.
3. Mejorar la seguridad e integridad de los datos.
11.5.- RECURSIVIDAD
Ejemplo:
RETURN NUMBER
IS
BEGIN
IF
N=0 THEN RETURN 1;
ELSE
RETURN N*F_RECURSIVA(N-1);
END IF;
END F_RECURSIVA;
/
DECLARE
V_SOL NUMBER;
BEGIN
V_SOL := F_RECURSIVA (&NUM);
DBMS_OUTPUT.PUT_LINE (V_SOL);
END;
/
12.1.- Introduccin.
12.2.- Sintaxis de creacin de paquetes.
12.3.- Utilizacin de los objetos definidos en el paquete.
12.4.- Borrado de un paquete.
12.5.- Declaraciones de cursores en un paquete.
12.6.- Ejemplo de creacin de paquetes.
12.1.- INTRODUCCIN.
Cabecera o especificacin:
Cuerpo:
Desarrollo de un paquete:
CABECERA O ESPECIFICACIN
CUERPO
Generalmente los objetos definidos en el paquete pueden ser utilizados por otros
paquetes, siempre y cuando sean pblicos (estn definidos en la cabecera). Aquellos
definidos en el cuerpo son para uso exclusivo del paquete y se les llama privados.
Sintaxis:
Hay que borrar por un lado la cabecera y por otro el cuerpo, utilizando para ello la
siguiente sintaxis:
Estos objetos se encuentran en el mismo lugar del Diccionario de Datos que los
procedimientos y las funciones es decir en las tablas USER_OBJECTS y USER_SOURCE.
Para declarar los cursores y que estos sean accesibles en el paquete hay que
hacerlo en la cabecera y desarrollarlos en el cuerpo.
PROCEDURE VER_POR_NUMERO
( V_EMPNO EMP.EMPNO%TYPE);
PROCEDURE VER_POR_APELLIDO
( V_APELLIDO EMP.ENAME%TYPE);
FUNCTION DATOS
( V_EMPNO EMP.EMPNO%TYPE)
RETURN T_REG_EMP;
END BUSCAR_EMP;
/
PROCEDURE VER_POR_NUMERO
( V_EMPNO EMP.EMPNO%TYPE)
IS
BEGIN
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO INTO VG_EMP
FROM EMP WHERE EMPNO=V_EMPNO;
VER_EMPLE;
END VER_POR_NUMERO;
PROCEDURE VER_POR_APELLIDO
(V_APELLIDO EMP.ENAME%TYPE)
IS
BEGIN
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO INTO VG_EMP
FROM EMP WHERE ENAME=V_APELLIDO;
VER_EMPLE;
END VER_POR_APELLIDO;
FUNCTION DATOS
(V_EMPNO EMP.EMPNO%TYPE)
RETURN T_REG_EMP
IS
BEGIN
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO INTO VG_EMP
FROM EMP WHERE EMPNO=V_EMPNO;
RETURN VG_EMP;
END DATOS;
PROCEDURE VER_EMPLE
IS
BEGIN
DBMS_OUTPUT.PUT_LINE (VG_EMP.NUM_EMPLEADO || '*' ||
VG_EMP.APELLIDO || '*' || VG_EMP.OFICIO || '*' ||
VG_EMP.SALARIO || '*' || VG_EMP.DEPARTAMENTO);
END VER_EMPLE;
END BUSCAR_EMP;
/
13.1.- Sobrecarga.
13.2.- Restricciones de funciones de paquetes usadas en sql.
13.3.- Paquetes proporcionados por ORACLE.
13.4.- El paquete DBMS_OUTPUT.
13.5.- El paquete DBMS_DDL.
13.1.- SOBRECARGA.
La sobrecarga:
Ejemplo:
DECLARE
TYPE DATATABTYP IS TABLE OF DATE
INDEX BY BYNARY_INTEGER;
TYPE REALTAB IS TABLE OF REAL
INDEX BY BYNARY INTEGER;
HIREDATE_TAB DATATABTYP;
SAL_TAB REALTABTYP;
INDX BYNARY_INTEGER;
BEGIN
INDX := 50;
INITIALIZE (HIREDATE_TAB, INDX); --LLAMAR A LA 1 VERSIN
INITIALIZE (SAL_TAB, INDX); --LLAMAR A LA 2 VERSIN
...
END;
Las restricciones sobre las funciones de un paquete utilizadas en SQL son las
siguientes:
Paquete Descripcin
Usos prcticos:
Puede dar salida a resultados intermedios para propsitos de depuracin.
Este paquete permite a los desarrolladores seguir de cerca la ejecucin de una
funcin o un procedimiento, enviando mensajes y valores al bfer de salida.
14.1.- Introduccin.
14.2.- Componentes de un TRIGGER.
14.3.- Sintaxis para la creacin de un TRIGGER a nivel sentencia.
14.4.- Creacin de TRIGGER a nivel registro.
14.5.- Diferencias entre TRIGGER y procedimiento.
14.6.- Gestin y borrado de TRIGGER.
14.7.- Pruebas sobre TRIGGERS.
14.8.- Reglas que gobiernan los TRIGGERS.
14.9.- Implementacin de TRIGGERS.
14.10.- TRIGGERS sobre vistas.
14.1.- INTRODUCCIN
1. De la base de datos: los cuales se ejecutan de forma implcita cuando se lanza una
sentencia DML contra una tabla.
INSERT
DELETE
UPDATE
3.- Tipos de TRIGGERS: Los TRIGGERS pueden ser de dos tipos dependiendo
de la ejecucin del cuerpo del mismo:
4.- Cuerpo del TRIGGER: o la accin que debe realizar el TRIGGER, que es un
bloque PL annimo.
Sintaxis.
Ejemplo:
Cuando un trigger falla, Oracle hace ROLLBACK sobre todas las sentencias del
TRIGGER.
INSERTING
DELETING
UPDATING
Ejemplo:
Modificar el ejemplo anterior, para que esto ocurra al realizar una insercin,
modificacin o eliminacin de datos los das 30 y 31 de cada mes.
Nota: La clusula updating (SAL) indica que la columna sal no puede ser modificada, si
en vez de poner elsif updating (SAL) then ponemos directamente else no podremos
realizar ninguna modificacin en ninguna columna, sino, slo nos prohibira modificar sal o
para prohibir todas las modificaciones tendramos que poner updating para todas las
columnas.
Sintaxis:
Donde:
Ejemplo:
1 fila actualizada.
COL1
----------------------------------------------------
SUBIDA SALARIO EMPLEADO 7788 1140 900
Para restringir la condicin del TRIGGER a solo aquellos registros que satisfagan
cierta condicin lo proporciona la clusula WHEN. En la clusula WHEN el calificador NEW
no necesita ir precedido de dos puntos.
TRIGGER PROCEDIMIENTO
CREATE TRIGGER CREATE PROCEDURE
Invocacin implcita. Invocacin explicita.
No admite COMMIT, SAVEPOINT y Si admite COMMIT, SAVEPOINT y
ROLLBACK ROLLBACK .
o USER _ OBJECTS
o USER_TRIGGERS;
o DBA_TRIGGERS;
1. Probar cada una de las operaciones de datos sobre los TRIGGERS, as como las
operaciones sobre otros datos.
2. Probar cada posibilidad de la clusula WHEN.
3. Provocar el disparo.
4. Probar el efecto del TRIGGER sobre otros TRIGGERS que provocarn un evento
hacia la misma tabla.
5. Probar el efecto de otros TRIGGERS sobre el actual.
Ejemplo 1:
Crear un TRIGGER, que se dispare antes de borrar un empleado, guardando sus datos
en la tabla AUDITAREMPLE.
DELETE EMP;
13 FILAS BORRADAS.
COL1
----------------------------------------------------------------
BORRADO EMPLEADO *7499*SMITH*30
...
Ejemplo 2:
1 fila creada.
UPDATE EMP
SET SAL = 3000
WHERE EMPNO=7521;
1 fila actualizada.
ROLLBACK;
Rollback terminado.
1.- No leer los datos de una tabla mutante. Una tabla mutante es aquella que
est siendo actualizada mediante sentencias DML, funciones o los efectos de una accin de
integridad referencial (FOREIGN KEY)
Ejemplo:
Crear un TRIGGER que garantice que siempre que se aaden un empleado a una
tabla EMP o se cambie un salario, el salario caiga dentro del establecido por el mximo y
por el mnimo. La condicin del TRIGGER ser que el nuevo trabajo sea distinto de
presidente.
END IF;
END;
/
2.- Combinando datos de una tabla restrictiva. Una tabla es restrictiva cuando
un TRIGGER tiene la necesidad de leer directamente una sentencia SQL o indirectamente
mediante una restriccin de integridad referencial.
Ejemplo:
Crear un TRIGGER que intente actualizar en cascada la clave fornea para los
registros hijos de la tabla EMP, a partir del cambio de la clave primaria de la tabla DEPT.
Ejemplo:
END IF;
END;
/
1 fila creada.
Ejemplo:
Acceso directo
Acceso indirecto
GRANT EXECUTE
ON HIRE_EMP
TO GREEN;
USER_OBJECTS
USER_SOURCE
SELECT TEXT
FROM USER_SOURCE
WHERE NAME = QUERY_EMP
ORDER BY LINE;
USER_ERRORS
SHOW ERRORS
USER_TRIGGERS
15.3.- DEPENDENCIAS.
VIEW TABLE
PROCEDURE VIEW
FUNCTION SEQUENCE
PACKAGE SPECIFICATION SYNONYM
PACKAGE BODY PROCEDURE
DATABASE TRIGGER FUNCTION
PACKAGE SPECIFICATION
Emisin de dependencia
Oracle Server registra automticamente las dependencias entre los objetos. Para
manejar dependencias, todos los objetos del esquema tienen un estatus (vlido o invlido) el
cual es registrado en el diccionario de datos.
Status Significado
VALID El objeto ha sido compilado y puede ser utilizado inmediatamente
cuando se referencia
INVALID El objeto tiene que ser compilado entes de que pueda ser
utilizado.
Dependencias USER_DEPENDECIES
Columna Descripcin
NAME Nombre del objeto dependiente
TYPE Tipo del objeto dependiente
REFERENCED_OWNER Esquema del objeto referenciado
REFERENCED_NAME Nombre del objeto referenciado
REFERENCED_TYPE Tipo del objeto referenciado
REFERENCED_LINK_NAME DATABASE LINK para acceder a los objetos
referenciados