Вы находитесь на странице: 1из 16

UNIVERSIDAD NACIONAL

“PEDRO RUIZ GALLO”

“FACULTAD DE INGENIERÍA CIVIL, SISTEMAS Y ARQUITECTURA”


“FACULTAD DE INGENIERÍA CIVIL,
“ESCUELA SISTEMAS
PROFESIONAL DE INGENIERÍA DE SISTEMAS”
Y ARQUITECTURA”
“ESCUELA PROFESIONAL DE
INGENIERÍA
“PROGRAMACIÓN DE SISTEMAS”
DE CURSORES DEL LADO DEL
SERVIDOR Y ACCESO A DATOS”

INTEGRANTES:
- Effio Chimoy Kristy Cameron
- García Pasapera Junior Aldair
- Ojeda Yovera Elmer Edu
- Pantoja Gonzales Cristhian André
- Rimarachín Rimarachín Eder Joaquín
DOCENTE:
Ing. Oscar Enrique Salazar Carbonel
CURSO:
Taller de Implementación y Administración
de Sistema de Base de Datos.
Tabla de contenido

CURSORES .................................................................................................................. 1
Definiciones .............................................................................................................. 1
Procesamiento de Cursores ....................................................................................... 1
Atributos de los Cursores .......................................................................................... 4
Bucles de Extracción ................................................................................................. 6
Bucles While ............................................................................................................. 7
Bucles For ................................................................................................................. 8
Tipos de Cursores ...................................................................................................... 9
Cláusulas ................................................................................................................. 12
Bibliografía.............................................................................................................. 12
PROGRAMACIÓN DE CURSORES DEL LADO DEL
SERVIDOR Y ACCESO A DATOS

CURSORES
Definiciones
Un cursor es una estructura de datos creada en memoria RAM producto de una sentencia
SELECCIONE y que nos permita navegar dentro de las filas para obtener la información.
(Vélez, 2017)
Un cursor es una variable que nos permite recorres con un conjunto de resultados
obtenidos a través de una sentencia SELECT fila por fila. (CIBERTEC, 2017)
PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un
conjunto de registros devuelto por una instrucción SQL. Técnicamente los cursores son
fragmentos de memoria reservados para procesar los resultados de una consulta SELECT
Procesamiento de Cursores
1. Declarar el cursor
Donde se indicarán (junto con el nombre del cursor) la consulta que el mismo
representará y algunas otras características bastante interesantes.
Sintaxis
DECLARE <NOMBRE_CURSOR> CURSOR
IS <SENTENCIA_SQL>

• INSENSITIVE solo se permiten las operaciones sobre la fila siguiente


• SCROLL los desplazamientos en las filas del cursor podrán hacerse en todos
los sentidos.
• UPDATE especifica que las actualizaciones se harán sobre la tabla de origen
del cursor. Un cursor INSENSITIVE con una cláusula ORDER BY no puede
actualizarse. Un cursor con ORDER BY, UNION, DISTINCT o HAVING es
INSENSITIVE y READ ONLY.

1
2. Apertura del cursor
Esta instrucción permite hacer operativo el cursor y crear eventualmente las tablas
temporales asociadas. La variable @@CURSOR_ROWS se asigna después de
OPEN.
Teniendo en cuenta el espacio en disco y la memoria utilizada, y el bloqueo
eventual de los datos en la apertura del cursor, esta operación debe ser ejecutada
lo más cerca posible del tratamiento de los datos extraídos del cursor.

Sintaxis
OPEN <NOMBRE_CURSOR>

3. Extracción de los resultados


Es la instrucción que permite extraer una fila del cursor y asignar valores a
variables con su contenido. Tras FETCH, la variable @@FETCH_STATUS está
a 0 si FETCH no retorna errores.

Sintaxis
FETCH [NEXT | PRIOR | LAST | ABSOLUTE n | RELATIVE n ]
[FROM] [GLOBAL ] <nombre del cursor>
[INTO lista de variables ]
NEXT

• NEXT lee la fila siguiente (única opción posible para los INSENSITIVE
CURSOR).
• PRIOR lee la fila anterior
• FIRST lee la primera fila
• LAST lee la última fila
• ABSOLUTE n lee la enésima fila del conjunto
• RELATIVE n lee la enésima fila a partir de la fila actual.

Cuando trabajamos con cursores, la función @@FETCH_STATUS nos indica el


estado de la última instrucción FETCH emitida. Los valores posibles son los
siguientes:

2
4. Cerrar el cursor
Cierra el cursor y libera la memoria. Esta operación debe interponerse lo antes
posible con el fin de liberar los recursos cuanto antes.
Sintaxis
CLOSE <nombre_cursor>

Después de cerrado el cursor, ya no es posible capturarlo o actualizarlo/eliminarlo.


Al cerrar el cursor se elimina su conjunto de claves dejando la definición del
cursor intacta, es decir, un cursor cerrado puede volver a abrirse sin tener que
volver a declararlo.

5. Liberación de cursor
Es un comando de limpieza, no forma parte de la especificación ANSI.

Sintaxis
DEALLOCATE <nombre_cursor>

Caso 01:
create or replace procedure caso1
is
cursor c_emp is select * from EMPLEADOBD;
r EMPLEADOBD%rowtype;
begin
open c_emp;
loop
fetch c_emp into r;
exit when c_emp%notfound;
dbms_output.put_line(r.NOMBRES_EMP || ' - ' || r.APELLIDOPAT_EMP);
end loop;
close c_emp;
end;

3
Ejecución

Atributos de los Cursores

Caso 02:
create or replace procedure caso3 is
cursor c_empleado is select * from EMPLEADOBD;
r EMPLEADOBD%rowtype;
begin
if not c_empleado%isopen
then
dbms_output.put_line('Atributo (IsOpen): Cerrado');
end if;

open c_empleado;

4
if c_empleado%isopen
then
dbms_output.put_line('Atributo (IsOpen): Abierto');
end if;

loop
fetch c_empleado into r;
exit when c_empleado%notfound;
dbms_output.put_line( 'DNI: ' || r.DNI_EMP || ' ATRIBUTO (RowCount):' ||
c_empleado%rowcount);
end loop;
close c_empleado;
end;

Ejecución

5
Bucles de Extracción
Bucles Simples
Implican el proceso completo de un cursor explícito: apertura, recorrido y cierre.
El proceso de recorrido por los valores que devuelve el cursor se realizará
implementando un bucle LOOP …. END LOOP.
Sintaxis
OPEN <nombre_cursor>
LOOP
FETCH <nombre del cursor> INTO …;
EXIT WHEN <nombre_cursor>% NOTFOUND;
..........
..........
END LOOP;
CLOSE <nombre_cursor>;

Caso 03:
create or replace procedure EMPLEADO_GENERO
is
cursor c_emp is select * from EMPLEADOBD;
r EMPLEADOBD%rowtype;
begin
open c_emp;
loop
fetch c_emp into r;
exit when c_emp%notfound;
CASE r.SEXO_EMP
when 0 then dbms_output.put_line(r.NOMBRES_EMP || ' - ' ||
r.APELLIDOPAT_EMP || ' GENERO: FEMENINO ');
when 1 then dbms_output.put_line(r.NOMBRES_EMP || ' - ' ||
r.APELLIDOPAT_EMP || ' GENERO: MASCULINO ');
END CASE;
end loop;
close c_emp;
end;

6
Ejecución

Bucles While
El bucle WHILE, se repite mientras que se cumpla la expresión:
Sintaxis
OPEN <nombre_cursor>
FETCH <nombre del cursor> INTO …;
WHILE <nombre_cursor> %FOUND LOOP;
..........
..........
FETCH <nombre del cursor> INTO …;
END LOOP;
CLOSE <nombre_cursor>;

Caso 04:
create or replace procedure caso5
is
cursor c_empleado is select * from EMPLEADOBD;
r EMPLEADOBD%rowtype;
begin
open c_empleado;
fetch c_empleado into r;
while c_empleado%found loop

7
fetch c_empleado into r;
dbms_output.put_line('DNI: ' || r.DNI_EMP || ' NOMBRE: ' || r.NOMBRES_EMP);
end loop;
close c_empleado;
end;

Ejecución

Bucles For
El bucle FOR se repite tanta veces como le indiquemos en los identificadores inicio y
final.
Sintaxis
FOR VARIABLE IN <nombre_cursor>
LOOP
..........
..........
END LOOP;

Caso 05:
CREATE OR REPLACE PROCEDURE PRfor
IS
CURSOR C_DEPT IS SELECT * FROM DEPARTAMENTOBD where
NUMERO_DEP < 6;
RESPUESTA VARCHAR2(100);
emps number;
BEGIN

8
FOR r in C_DEPT LOOP
select sum(SALARIO_EMP) into emps from EMPLEADOBD where NUMERO_DEP
= r.NUMERO_DEP;
RESPUESTA := 'La suma del salario de todos los empleados del departamento ' ||
r.NOMBRE_DEP || ' es ' || emps;
dbms_output.put_line(RESPUESTA);
END LOOP;
END;
Ejecución:

Tipos de Cursores
Cursores implícitos
Los cursores implícitos se utilizan para realizar consultas SELECT que devuelven un
único registro. Deben tenerse en cuenta los siguientes puntos cuando se utilizan cursores
implícitos:
Con cada cursor implícito debe existir la palabra clave INTO.
Las variables que reciben los datos devueltos por el cursor tienen que contener el
mismo tipo de dato que las columnas de la tabla.
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.

Caso 06:
create or replace procedure caso7 is
dni number;
begin
SELECT DNI_EMP INTO dni from EMPLEADOBD WHERE APELLIDOPAT_EMP =
'Oliden';
dbms_output.put_line('El DNI es: ' || dni);
end;

9
Ejecución

Cursores explícitos
Los cursores explícitos se emplean para realizar consultas SELECT que pueden
devolver cero filas o más de una fila. Para trabajar con un cursor explícito necesitamos
realizar las siguientes tareas:
Declarar el cursor.
Abrir el cursor con la instrucción OPEN.
Leer los datos del cursor con la instrucción FETCH.
Cerrar el cursor y liberar los recursos con la instrucción CLOSE

Sintaxis
CURSOR nombre_cursor IS
instrucción_SELECT // Se declara el cursor

CURSOR nombre_cursor(param1 tipo1, ..., paramN tipoN) IS


instrucción_SELECT // Declaración de cursor con
parámetro

OPEN nombre_cursor; // Abrir un cursor

OPEN nombre_cursor(valor1, valor2, ..., valorN); // abrir


cursor con parámetros

FETCH nombre_cursor INTO lista_variables; // Recuperada


datos en variables

FETCH nombre_cursor INTO registro_PL/SQL; // Recupera


datos en registro

CLOSE nombre_cursor; // Cierra el cursor

10
Caso 07:
declare
cursor c1 is select PROYECTOBD.NOMBRE_PRO,
sum(ASIGNACIONBD.HORASSEM_ASI) from PROYECTOBD inner join
ASIGNACIONBD on PROYECTOBD.NUMERO_PRO =
ASIGNACIONBD.NUMERO_PRO group by NOMBRE_PRO;
nombre varchar2(50);
horas number;
begin
open c1;
LOOP
FETCH C1 INTO nombre, horas;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('El proyecto '|| nombre || ' tuvo ' || horas || ' horas
asignadas');
END LOOP;
close c1;
end;
Ejecución

11
Cláusulas
Cláusula FOR UPDATE
El bloqueo explícito le permite denegar el acceso mientras dura una transacción.
Bloquee las filas antes de la actualización o supresión.
La cláusula FOR UPDATE es la última cláusula de una sentencia SELECT,
incluso después del ORDER BY.
NOWAIT devuelve un error de Oracle si las filas han sido bloqueadas por otra
sesión, de lo contrario se espera.
Sintaxis
FOR UPDATE <OF nombre_columna>[NOWAIT]

Cláusula WHERE CURRENT OF


Incluya la cláusula FOR UPDATE en la definición del cursor para bloquear las
filas.
Especifique WHERE CURRENT OF en la sentencia UPDATE o DELETE para
referirse a la fila actual del cursor.
Sintaxis
{UPDATE|DELETE}………
WHERE CURRENT OF <nombre_cursor>;

Caso 08:
declare
la_asignacion ASIGNACIONBD%rowtype;
cursor c111 is select * from ASIGNACIONBD where NSS_EMP in (select NSS_EMP
from EMPLEADOBD where NSS_EMP = 14786017) for update;
begin
open c111;
loop
fetch c111 into la_asignacion;
EXIT WHEN (C111%notfound);
if(la_asignacion.HORASSEM_ASI < 10) then
UPDATE ASIGNACIONBD SET HORASSEM_ASI = 10
WHERE CURRENT OF c111;
end if;
end loop;
close c111;

12
end;

Antes de la ejecución:

Después de la ejecución:

13
Bibliografía
CIBERTEC. (2017). Base de Datos Avanzado I. Perú: Instituto Superior Tecnológico Cibertec .

Coronel, G. (2005). Oracle 9i-PL/SQL. Perú: CEPS-UNI.

Vélez, L. (2017). Gestón de Base de Datos.Versión 1.0. Madrid,España: Departamento de


Informática.

14

Вам также может понравиться