Este documento proporciona una introducción al lenguaje PL/SQL. PL/SQL es un lenguaje de programación procedural diseñado por Oracle que extiende SQL. Permite declarar variables, constantes, estructuras de control como bucles y condicionales, y manejo de excepciones. Los bloques PL/SQL contienen declaraciones, instrucciones y secciones de manejo de excepciones. Se pueden usar cursores para recuperar y procesar múltiples filas de una consulta.
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
Sql
1. Bases de Datos
Unidad
El Lenguaje PL/SQL
2011 Erwin Fischer 2
2. PL/SQL
• Es una extensión procedimental de SQL
diseñada por Oracle
• Se basa en conceptos similares a los lenguajes
de programación modernos. (declaracion de
variables y constantes, estructuras de control, manejo
de excepciones y modularización).
• Es un lenguaje con estructura de bloques: Los
bloques pueden ser completamente
independientes o estar anidados uno dentro de
otros
• Las unidades básicas son : Procedimientos,
funciones y bloques anonimos.
2011 Erwin Fischer 3
3. Estructura general de un bloque
PL/SQL
[DECLARE Opcional
- declaraciones]
BEGIN Obligatorio
- instrucciones ejecutables
[EXCEPTION Opcional
- rutinas de manejo de excepciones]
END; Obligatorio
2011 Erwin Fischer 4
4. Declaraciones en PL/SQL
• Las variables y constantes deben declararse antes de
poder referenciarlas.
• Ej:
– vNumEmpleado VARCHAR2(5);
– vRenta NUMBER(6,2) NOT NULL := 600;
– MAX_PROPIEDADES CONSTANT NUMBER := 100
• Es posible declarar variables de acuerdo al tipo de
otras variables
• vNumEmpleado Empleado.numEmpleado%TYPE;
• vNumEmpleado1 vNumEmpleado%TYPE;
• beerTuple Beers%ROWTYPE;
2011 Erwin Fischer 5
5. Asignaciones en PL/SQL
• Se pueden asignar variables de dos formas
distintas: Utilizando (:=) o como resultado de
una instrucción SELECT o FETCH
• Ej:
– vNumEmpleado := ‘SG14’;
– vRenta := 500;
– SELECT COUNT(*) INTO X
FROM Propiedad
WHERE numEmpleado = vNumEmpleado;
2011 Erwin Fischer 6
6. Un programa Simple en PL/SQL
drop table T1; // Se elimina la tabla en caso que exista, si no existe da un error, pero no importa
CREATE TABLE T1(
e INTEGER,
f INTEGER
);
Begin
DELETE FROM T1;
INSERT INTO T1 VALUES(1, 3);
INSERT INTO T1 VALUES(2, 4);
End
select * from t1
/* Lo de arriba es SQL; debajo es el programa PL/SQL */
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b
FROM T1
WHERE e>1;// Este select asigna el atributo e->a y f->b, de todos aquellos registros cuyo atributo e > 1
INSERT INTO T1 VALUES(b,a);
END;
2011 Erwin Fischer 7
7. Veamos que ocurre 1
• Se crea la tabla t1 y se insertan
dos registros.
2011 Erwin Fischer 8
8. El procedimiento anónimo
select * from t1
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b
FROM T1
WHERE e>1
INSERT INTO T1 VALUES(b,a);
END;
select * from t1
2011 Erwin Fischer 9
9. ¿Qué ocurre si ejecuto nuevamente el
procedimiento anónimo?
• Escribir en el Blog, una explicación
a lo que ocurre al ejecutar
nuevamente el procedimiento:
DECLARE
a NUMBER;
select * from t1
b NUMBER;
BEGIN
SELECT e,f INTO a,b
FROM T1
WHERE e>1
INSERT INTO T1 VALUES(b,a);
END;
2011 Erwin Fischer 10
10. Instrucciones de Control en
PL/SQL
• PL/SQL soporta los mecanismos
habituales de control de flujo condicional,
iterativo y secuencial
• IF-THEN-ELSE-END IF;
• LOOP-EXIT WHEN-END LOOP;
• FOR-END LOOP;
• WHILE-END LOOP;
• GOTO;
2011 Erwin Fischer 11
11. Instrucción IF
Syntax #1: IF-THEN
IF condition THEN
{...statements...}
END IF;
Syntax #2: IF-THEN-ELSE
IF condition THEN
{...statements...}
ELSE
{...statements...}
END IF;
Syntax #3: IF-THEN-ELSIF
IF condition THEN
{...statements...}
ELSIF condition THEN
{...statements...}
ELSE
{...statements...}
END IF;
2011 Erwin Fischer 12
12. Un programa Simple en PL/SQL
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1;
IF b=1 THEN
INSERT INTO T1 VALUES(b,a);
ELSE
INSERT INTO T1 VALUES(b+10,a+10);
END IF;
END;
2011 Erwin Fischer 13
13. ¿Qué hace este
Procedimiento anónimo?
select * from t1
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1;
IF b=1 THEN
INSERT INTO T1 VALUES(b,a);
ELSE
INSERT INTO T1 VALUES(b+10,a+10);
END IF;
END;
2011 Erwin Fischer 14
14. Instrucción Loop
LOOP
{.statements.}
END LOOP;
Ejemplo
LOOP
monthly_value := daily_value * 31;
EXIT WHEN monthly_value > 4000;
END LOOP;
2011 Erwin Fischer 15
15. Un programa Simple en PL/SQL
DECLARE
i NUMBER := 1;
BEGIN
LOOP
INSERT INTO T1 VALUES(i,i);
i := i+1;
EXIT WHEN i>100;
END LOOP;
END;
2011 Erwin Fischer 16
16. El ciclo FOR
FOR loop_counter IN [REVERSE]
lowest_number..highest_number
LOOP
{.statements.}
END LOOP;
2011 Erwin Fischer 17
17. Ejemplos de Ciclo FOR
FOR Lcntr IN 1..20 FOR Lcntr IN REVERSE 1..15
LOOP LOOP
LCalc := Lcntr * 31; LCalc := Lcntr * 31;
END LOOP; END LOOP;
2011 Erwin Fischer 18
18. El Ciclo While
WHILE condition
LOOP
{.statements.}
END LOOP;
2011 Erwin Fischer 19
19. Ejemplo de ciclo While
WHILE monthly_value <= 4000
LOOP
monthly_value := daily_value * 31;
END LOOP;
2011 Erwin Fischer 20
21. Cursores
• La instrucción SELECT puede utilizarse si la consulta
devuelve una fila y solo una fila.
• Los cursores se utilizan para el tratamiento de una
consulta que pueda devolver un numero arbitrario de
filas (es decir cero, una o más filas)
• En la practica el cursor actúa como un puntero que
dirige hacia una fila concreta el resultado de la
consulta.
• El cursor puede avanzar una posición para acceder a la
siguiente fila.
• Es necesario declarar y abrir los
cursores antes de utilizarlos
2011 Erwin Fischer 22
22. Cursores, un Ejemplo
1. DECLARE
2. vIdEmpleado employees.employee_id%TYPE;
3. vNombre employees.first_name%TYPE;
4. vApellido employees.last_name%TYPE;
5. CURSOR ListaEmpleadoCursor IS
6. SELECT employee_id, first_name, last_name FROM employees FOR UPDATE;
7. BEGIN
8. OPEN ListaEmpleadoCursor;
9. LOOP
10. FETCH ListaEmpleadoCursor INTO vIdEmpleado, vNombre, vApellido;
11. EXIT WHEN ListaEmpleadoCursor%NOTFOUND;
12. dbms_output.put_line ('Id : '||vIdEmpleado
13. ||' Nombre : '|| vNombre
14. || 'Apellido : '|| vApellido);
15. END LOOP;
16. CLOSE ListaEmpleadoCursor;
17. END;
2011 Erwin Fischer 23
23. Un cursor dentro de otro
cursor - obtieneTablas
• Un cursor que lista todas las tablas
con sus respectivas columnas,
correspondiente al propietario HR
2011 Erwin Fischer 24
24. Tablas all_tables y all_tab_columns
select distinct tablas.owner, tablas.table_name
from all_tables tablas
where tablas.owner = 'HR';
select distinct col.column_name
from all_tab_columns col
where upper(col.owner) = 'HR'
and lower(col.table_name) = 'employees';
2011 Erwin Fischer 25
25. Declarando las Variables y
los cursores
DECLARE
vPropietario varchar2(40);
vNombreTabla varchar2(40);
vNombreColumna varchar2(100);
/* Primer cursor */
cursor obtieneTablas is
select distinct t.owner, t.table_name
from all_tables t
where t.owner = 'HR';
/* Segundo cursor */
cursor obtieneColumnas is
select distinct c.column_name
from all_tab_columns c
where c.owner = vPropietario
and c.table_name = vNombreTabla;
2011 Erwin Fischer 26
26. El cuerpo del cursor
begin
open obtieneTablas;
dbms_output.put_line('Abriendo Cursor - obtieneTablas');
loop fetch obtieneTablas into vPropietario, vNombreTabla;
exit when obtieneTablas%NOTFOUND;
dbms_output.put_line('Tabla : ‘||Propietario||'.'||vNombreTabla);
open obtieneColumnas;
loop fetch obtieneColumnas into vNombreColumna;
exit when obtieneColumnas%NOTFOUND;
dbms_output.put_line(‘=>’||vNombreTabla||'.'||vNombreColumna);
end loop;
close obtieneColumnas;
end loop;
close obtieneTablas;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'Se ha detectado un error -
'||SQLCODE||' -ERROR- '||SQLERRM);
end;
2011 Erwin Fischer 27
27. Paso de Parámetros en Cursores
CURSOR obtieneTablas(pPropietario VARCHAR2) IS
select distinct t.owner, t.table_name
from all_tables t
where t.owner = pPropietario;
Con lo que podríamos abrir el cursor
OPEN obtieneTablas (´HR’);
OPEN obtieneTablas(´SYSTEM’);
Actividad : Modifique el cursor aplicando paso de parámetros, y
publique en su blog.
2011 Erwin Fischer 28
28. Tarea Cursor ParImpar
• Agregue un atributo a la tabla EMPLOYEES,
denominado TipoId, que va a contener un
string.
• Desarrolle un cursor que permita completar
dicho atributo de acuerdo al siguiente criterio:
SI employee_id es Par
Entonces
TipoId = ‘PAR’
Si-no
TipoId = ‘IMPAR’
• Suba la solución a su Blog HOY.
• 2011 Erwin Fischer 29