Professional Documents
Culture Documents
BASES DE DATOS
CURSORES
Facultad de ingeniería
Usan
En un cursor implícito no se puede usar OPEN, FETCH ni CLOSE.
Conjunto activo
Alexis Rojas Cordero
Página –4–
CURSORES
Cursores Implícitos. Deben tenerse en cuenta los siguientes puntos cuando
se utilizan cursores implícitos:
Los cursores implícitos solo pueden devolver una única fila. En caso de que se
devuelva más de una fila (o ninguna fila) se producirá una excepción. Usan
Usan
Pasos necesarios para procesar un cursor:
• Declaración de un CURSOR.
• Apertura del CURSOR para una consulta.
• Recuperar los resultados de la variables PL/SQL.
• Cierre del CURSOR.
Cierra el
Crea el cursor y
área para descarga la
el cursor NO memoria
Carga la
Identifica fila en Verifica
el conjunto las vbles si quedan
activo con filas para
INTO cargar
DECLARE
CURSOR <<nombre_cursor>> IS
SELECT <<lista de campos >>
FROM << nombre_tabla >>Usan
[WHERE << condiciones >> ];
BEGIN …
DECLARE
CURSOR cur_estudiantes IS Usan
SELECT nombre, apellidos
FROM estudiantes;
v_fila_estud cur_estudiantes%ROWTYPE;
CURSOR dpto_cursor IS
SELECT *
FROM departamentos Usan
WHERE cod_dpto > 10;
V_trabajo number(9);
BEGIN
…
OPEN nombre_cursor;
Es legal abrir un cursor que ya esté abierto. PL/SQL ejecutará implícitamente un
CLOSE antes de re-abrir el cursor con la segunda orden OPEN.
CURSOR emp_cursor IS
SELECT cod_empleado, nombre_empleado
FROM emp;
Usan
BEGIN
OPEN emp_cursor;
FOR i IN 1..5 LOOP
FETCH emp_cursor INTO v_cod_emp, v_nom_emp;
...
...
END LOOP;
CLOSE emp_cursor;
END;
CLOSE nombre_cursor;
Si intentamos cerrar un cursor que ya está cerrado nos
daría un error ORA-1001.
Usan
Ejemplo:
Usan
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP
FETCH emp_cursor . . .
Usan
CURSOR emp_cursor IS
SELECT cod_empleado, nombre_empleado
FROM emp;
BEGIN
OPEN emp_cursor; Usan
LOOP
FETCH emp_cursor INTO v_cod_empleado, v_nom_empledo;
EXIT WHEN emp_cursor%ROWCOUNT > 10 OR
emp_cursor%NOTFOUND;
...
END LOOP;
CLOSE emp_cursor;
END;
Usan
La instrucción
Usan
IF c_obli_deudor%FOUND
Se encarga de verificar
Si el conjunto activo
Tiene elementos.
Si es TRUE entonces
Procesa lo que está en
azul
DECLARE
CURSOR emp_cursor IS
SELECT cod_empleado, nombre_empleado FROM emp;
emp_registro emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor; Usan
LOOP
FETCH emp_cursor INTO emp_registro;
EXIT WHEN emp_cursor%NOTFOUND;
INSERT INTO lista_temp (cod_lista, nom_lista)
VALUES(emp_registro.cod_empleado, emp_registro.nombre_empleado);
END LOOP;
COMMIT;
CLOSE emp_cursor;
END;
BEGIN
FOR registro_emp IN emp_cursor LOOP
IF emp_cursor%FOUND THEN Usan
IF registro_emp.sueldo > 3800 THEN
DBMS_OUT.PUT_LINE(‘ Trabajador ‘|| registro_emp.nomre_empleado ||
‘ tiene un sueldo de: ‘ || registro_emp.sueldo); ado);
END IF; -- endif del registro
END IF, -- ENDIF del emp_cursor
END LOOP; Cierre automático del cursor
END;