Herramienta CURSOR; cuál es la ventaja?
Saludos...
El cursor no es una herramienta...
El cursor es un "buffer" donde se guardan los datos de una consulta (o actualización si lo permite la base de datos) y puedes desplazarte desde el registro base hasta el final y algunas bd permiten invertido (de atrás hacia adelante) o saltar a una tupla específica también, para realizar un proceso específico dentro del ciclo de programación de la función o procedimiento..
De acuerdo al nivel de la base de datos tienes esas opciones, en las de bajo nivel NO TODAS y muchas veces NINGUNA...
te pongo dos ejemplos simples para que lo entiendas...
En este caso la programación es con el gestor de base de datos ASA (Adaptive Server Anywhere):
Ejemplo 1: en el horario que de acuerdo a los parámetros dados se dicta la materia aparecería...
'"1101 Matemática I, 1401 Física II"
create function DBA.f_busca_horario_dia_lapso(in @facultad integer,in @escuela integer,in @periodo varchar(12),in @horario integer,in @dia integer,in @lapso integer)
returns varchar(64)
begin
declare @texto varchar(64);
declare @texto1 varchar(32);
declare @materia integer;
declare @codigo varchar(24);
declare @grupo integer;
-- Declare the "error not found" exception
declare err_notfound exception for sqlstate value '02000';
-- Crea el cursor
declare cursor_horario dynamic scroll cursor for select HORARIO_HORAS.CODI_MATERIA,if(HORARIO_HORAS.GRUPO_SECCION is null or HORARIO_HORAS.GRUPO_SECCION=0) then 'Sec.: '+HORARIO_HORAS.SECCION+' '+HORARIO_HORAS.CODI_AULA else 'Sec.: '+HORARIO_HORAS.SECCION+' Grupo: '+cast(HORARIO_HORAS.GRUPO_SECCION as varchar(2))+' '+HORARIO_HORAS.CODI_AULA endif as seccion_aula from
HORARIO_HORAS where
(HORARIO_HORAS.CODI_FACULTAD_DEPENDENCIA=@facultad)
and(HORARIO_HORAS.CODI_ESCUELA_DEPARTAMENTO=@escuela)
and(HORARIO_HORAS.CODI_PER_ACTIVIDAD=@periodo)
and(HORARIO_HORAS.CODIGO_HORARIO=@horario)
and(HORARIO_HORAS.DIA_HORARIO=@dia)
and(HORARIO_HORAS.CODIGO_LAPSO=@lapso);
-- Procesa el cursor
set @texto='';
open cursor_horario;
fetch first cursor_horario into @materia,@texto1;
MovimientoLoop: loop
if sqlstate=err_notfound then
leave MovimientoLoop
end if;
---Lógica del Cursor…
select materia.apoc_materia into @codigo from materia where
(materia.codi_facultad_dependencia=@facultad
and materia.codi_escuela_departamento=@escuela
and materia.codi_materia=@materia);
if length(@texto)=0 then
set @texto=@codigo+' '+@texto1
else
set @texto=@texto+','+@codigo+' '+@texto1
end if;
--- Próximo registro
fetch next cursor_horario into @materia,
@texto1
end loop MovimientoLoop;
close cursor_horario;
return(@texto)
end;
Ejemplo 2: Para actualización de tablas
create function dba.F_CERTIFICADO_CONSECUTIVO(in @fac integer,in @esc integer,in @CODIGO integer)
returns integer
begin
declare @COD integer;
declare @NUMERO integer;
-- DECLARE THE "ERROR NOT FOUND" EXCEPTION
declare ERR_NOTFOUND exception for sqlstate value '02000';
-- CREA EL CURSOR PARA EL CONSECUTIVO DE MOVIMIENTO
declare CURSOR_MOVIMIENTO dynamic scroll cursor for select CERTIFICACION.NUMERO_CERTIFICACION from
CERTIFICACION where
(CERTIFICACION.FACULTAD=@fac)
and(CERTIFICACION.ESCUELA=@esc)
and(CERTIFICACION.TIPO=@CODIGO);
--CURSOR DE CONSECUTIVO.
open CURSOR_MOVIMIENTO;
fetch first CURSOR_MOVIMIENTO into @NUMERO;
-- PROCESA EL CURSOR
if @numero is null then
set @numero=0;
end if;
set @NUMERO=@NUMERO+1;
update CERTIFICACION set NUMERO_CERTIFICACION=@NUMERO where current of CURSOR_MOVIMIENTO;
close CURSOR_MOVIMIENTO;
return(@NUMERO)
end;
espero que te sirva..