MySQL - Herramienta CURSOR; cuál es la ventaja?

 
Vista:
Imágen de perfil de Braulio (Brad)

Herramienta CURSOR; cuál es la ventaja?

Publicado por Braulio (Brad) (13 intervenciones) el 15/07/2016 15:59:45
Estimados gurúes MySQL;

aprendiendo de Procedimientos Almacenados (PA) me encuentro con el comando CURSOR. De todo lo que he visto y leído hasta ahora sólo encuentro el cómo hacerlo pero no el porqué.

Yo veo que dentro de un PA puedo guardar los resultados de los diferentes SELECT en una secuencia tablas y, al final, borrar aquellas intermediarias que ya no me sirven. Sin embargo, intuyo que la herramienta CURSOR ayuda en este proceso.

Por favor, explican para qué existe el comando CURSOR y cuál es su conveniencia? Si me pueden indicar un buen contenido web, mejor.

Muchas gracias!

Brad
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Herramienta CURSOR; cuál es la ventaja?

Publicado por Leopoldo Taylhardat (44 intervenciones) el 15/07/2016 21:23:52
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..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar