Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porAna María Fidalgo Maldonado Modificado hace 8 años
1
Base de Datos I – Ing. Mary Carlota Bernal J. Cada instrucción PL/SQL tiene asociado internamente un cursor Los cursores en PL/SQL pueden ser de dos tipos: Cursores Implícitos: Declarados por todas las instrucciones DML y por la instrucción SELECT y controlados por el Oracle Server Cursores Explícitos: Declarados y controlados por el programador, usados para manejar consultas que retornan mas de una fila Cursores en PL/SQL
2
Base de Datos I – PL/SQL Cursor Implícito Hay cuatro atributos asociados a los cursores implícitos que permiten controlar y verificar el resultado de su ejecución:
3
Base de Datos I – PL/SQL Cursor Implícito Atributos de Cursores en PL/SQL:
4
Base de Datos I – PL/SQL Utilice cursores explícitos para procesar individualmente cada fila que se devuelve en una sentencia SELECT de múltiples filas. El conjunto de filas que devuelve una consulta de múltiples filas se denomina conjunto activo. Su tamaño equivale al número de filas que cumplen el criterio de búsqueda. El diagrama de la transparencia muestra cómo un cursor explícito “apunta” a la fila actual del conjunto activo. De esta manera, el programa puede procesar las filas de una en una.
5
Base de Datos I – PL/SQL Crea el área SQL con el nombre del cursor Extrae el conjunto de datos Lee la fila actual en las variables Chequea si hay datos en el cursor Recupera la fila actual Libera el área de datos usada por el cursor SI NO DECLARE VACI O OPEN FETCHCERRAR Control de Cursores Explícitos
6
Base de Datos I – PL/SQL cursor Puntero Apertura del cursor Recuperación de filas Continúa hasta que el cursor esté vacío Cierre del cursor Control de Cursores Explícitos
7
Base de Datos I – PL/SQL
11
El cursor se abre para ejecutar el query e identificar el conjunto de filas que serán recuperadas Si la consulta no retorna filas, no se levantan excepciones Se pueden usar los atributos de cursor para chequear el estatus del cursor después de cada FECTH OPEN; OPEN nombre_cursor; Apertura del Cursor
12
Base de Datos I – PL/SQL
14
Recupera la fila actual en las variables de salida El número y tipo de las variables debe coincidir con el de las columnas recuperadas Cada variable recibirá el valor correspondiente a la columna que le corresponde según la posición Se debe chequear para verificar si el cursor contiene filas FETCHINTO FETCH nombre_cursor INTO [variable1 ; [,variable2,…] | nombre_registro]; Recuperación de Datos desde el Cursor
15
Base de Datos I – PL/SQL FETCHINTO; FETCH empleados INTO v_empno, v_nombre; … OPEN; OPEN cursor_definido; LOOP FETCHINTO; FETCH cursor_definido INTO variables; EXITWHEN; EXIT WHEN …; … -- Procesamiento de la fila de datos … ENDLOOP; END LOOP; END; Recuperación de Datos desde el Cursor
16
Base de Datos I – PL/SQL
17
Cierre del Cursor El cursor se debe cerrar al terminar de cerrar el procesamiento de las filas El cursor puede ser reabierto si es necesario No intente recuperar una fila de datos una vez que el cursor haya sido cerrado CLOSE; CLOSE nombre_cursor; … FORINLOOP FOR i IN 1..10 LOOP FETCHINTO; FETCH empleados INTO v_empno, v_nombre; … ENDLOOP; END LOOP; CLOSE; CLOSE empleados;
18
Base de Datos I – PL/SQL
19
La recuperación de filas solo es posible cuando el cursor está abierto El atributo %ISOPEN se usa para evitar tratar de recuperar una fila de datos cuando el cursor está cerrado IFNOT%ISOPENTHEN IF NOT empleados%ISOPEN THEN OPEN; OPEN empleados; ENDIF; END IF; LOOP FETCHINTO...; FETCH empleados INTO...; Atributo %ISOPEN
20
Base de Datos I – PL/SQL El atributo %ROWCOUNT se usa para obtener el número de filas tratadas El atributo %NOTFOUND se usa para determinar cuando salir del cursor... OPEN; OPEN empleados; LOOP FETCHINTO; FETCH empleados INTO...; EXITWHEN%ROWCOUNT> EXIT WHEN empleados%ROWCOUNT > 25 OR%NOTFOUND; OR empleados%NOTFOUND;... Los Atributos %NOTFOUND y %ROWCOUNT
21
Base de Datos I – PL/SQL
22
Es la forma mas sencilla de procesar cursores explícitos Los eventos OPEN, FETCH y CLOSE están implícitos El registro también está declarado implícitamente FORINLOOP FOR reg_empleado IN nombre_cursor LOOP ; instrucciones; ENDLOOP; END LOOP; Ciclo FOR usado como Cursor
23
Base de Datos I – PL/SQL DECLARE CURSORIS CURSOR empleados IS SELECT SELECT empno, nombre FROM; FROM empleado; BEGIN FORINLOOP FOR reg_empleado IN empleados LOOP ; instrucciones; ENDLOOP; END LOOP; END; Ciclo FOR usado como Cursor
24
Base de Datos I – PL/SQL BEGIN FORINSELECT FOR reg_empleado IN (SELECT empno, nombre FROMLOOP FROM empleado) LOOP ; instrucciones; ENDLOOP; END LOOP; END; En este caso no es necesario declarar el cursor Cursor FOR usado como Sub-Queries
25
Base de Datos I – PL/SQL Los parámetros se evalúan cuando el cursor es abierto y el query es ejecutado Se usan cuando se necesita abrir un cursor varias veces con valores distintos cada vez CURSOR CURSOR nombre_cursor [(nombre_parametro tipo, …)] IS SELECT; SELECT …; OPEN (valor_parametro, …) OPEN nombre_cursor (valor_parametro, …) IN nombre_parametro [IN] :=DEFAULT tipo_dato [{:= | DEFAULT} expresion] Cursores Con Parámetros
26
Base de Datos I – PL/SQL Ejemplo: DECLARE CURSOR MICURSOR (SUELDO NUMBER) IS SELECT NOMBRE, OFICIO, SALARIO FROM EMPLEADO WHERE SALARIO > SUELDO; BEGIN OPEN MICURSOR (2000);................ (otras sentencias)........ OPEN MICURSOR (3000); END; / Cursores Con Parámetros
27
Base de Datos I – PL/SQL Los cursores pueden ser utilizados para actualizar o borrar la fila actual Incluya la cláusula FOR UPDATE en el SELECT del cursor para asegurar primero el bloqueo de las filas de datos Use la cláusula WHERE CURRENT OF para referenciar la fila actual desde un cursor explícito. Esto sin necesidad de utilizar o referenciarlo por el ROWIND. WHERE CURRENT OF; WHERE CURRENT OF nombre_cursor; Cláusula WHERE CURRENT OF
28
Base de Datos I – PL/SQL Ejemplo: Cláusula WHERE CURRENT OF DECLARE CURSOR CURSOR_EMP IS CURSOR CURSOR_EMP IS SELECT emp_no, nombre, salario, dnombre FROM empleados e, depart d WHERE e.dept_no = d.dept_no AND d.dept_no = 80 FOR UPDATE OF salario NOWAIT; BEGIN FOR registro_emp IN cursor_emp LOOP IF registro_emp.salario < 5000 THEN UPDATE empleados SET salario = registro_emp.salario*1.10 WHERE CURRENT OF cursor_emp; WHERE CURRENT OF cursor_emp; END IF; END LOOP; END; /
29
Base de Datos I – PL/SQL DECLARE DECLARE CURSOR IS CURSOR mixto IS SELECT SELECT t1.numdept, nombre, staff FROM FROM departamento t1, (SELECT, (SELECT numdept, count(*) staff FROM FROM empleado GROUP BY ) t2 GROUP BY numdept) t2 WHERE WHERE t1.numdept = t2.numdept AND ; AND staff > 1; Cursores con Sub-Queries
30
Base de Datos I – PL/SQL
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.