Sql

978 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
978
On SlideShare
0
From Embeds
0
Number of Embeds
64
Actions
Shares
0
Downloads
61
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Sql

  1. 1. Bases de Datos Unidad El Lenguaje PL/SQL 2011 Erwin Fischer 2
  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. 3. Estructura general de un bloquePL/SQL [DECLARE Opcional - declaraciones] BEGIN Obligatorio - instrucciones ejecutables [EXCEPTION Opcional - rutinas de manejo de excepciones] END; Obligatorio 2011 Erwin Fischer 4
  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. 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. 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. 7. Veamos que ocurre 1 • Se crea la tabla t1 y se insertan dos registros. 2011 Erwin Fischer 8
  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. 9. ¿Qué ocurre si ejecuto nuevamente elprocedimiento 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. 10. Instrucciones de Control enPL/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. 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. 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. 13. ¿Qué hace esteProcedimiento 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. 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. 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. 16. El ciclo FOR FOR loop_counter IN [REVERSE] lowest_number..highest_number LOOP {.statements.} END LOOP; 2011 Erwin Fischer 17
  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. 18. El Ciclo While WHILE condition LOOP {.statements.} END LOOP; 2011 Erwin Fischer 19
  19. 19. Ejemplo de ciclo While WHILE monthly_value <= 4000 LOOP monthly_value := daily_value * 31; END LOOP; 2011 Erwin Fischer 20
  20. 20. Cursores2011 Erwin Fischer 21
  21. 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. 22. Cursores, un Ejemplo1. DECLARE2. vIdEmpleado employees.employee_id%TYPE;3. vNombre employees.first_name%TYPE;4. vApellido employees.last_name%TYPE;5. CURSOR ListaEmpleadoCursor IS6. SELECT employee_id, first_name, last_name FROM employees FOR UPDATE;7. BEGIN8. OPEN ListaEmpleadoCursor;9. LOOP10. FETCH ListaEmpleadoCursor INTO vIdEmpleado, vNombre, vApellido;11. EXIT WHEN ListaEmpleadoCursor%NOTFOUND;12. dbms_output.put_line (Id : ||vIdEmpleado13. || Nombre : || vNombre14. || Apellido : || vApellido);15. END LOOP;16. CLOSE ListaEmpleadoCursor;17. END; 2011 Erwin Fischer 23
  23. 23. Un cursor dentro de otrocursor - obtieneTablas • Un cursor que lista todas las tablas con sus respectivas columnas, correspondiente al propietario HR 2011 Erwin Fischer 24
  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. 25. Declarando las Variables ylos 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. 26. El cuerpo del cursorbegin 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. 27. Paso de Parámetros en CursoresCURSOR 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 cursorOPEN obtieneTablas (´HR’);OPEN obtieneTablas(´SYSTEM’);Actividad : Modifique el cursor aplicando paso de parámetros, y publique en su blog. 2011 Erwin Fischer 28
  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
  29. 29. Unidad - PL/SQL • Fin 2011 Erwin Fischer 30

×