Ver Mensaje Individual
  #6  
Antiguo 14-04-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Reputación: 28
jachguate Va por buen camino
Hola.

Hay varias formas de conseguir el resultado desde un sp. Me he dado a la tarea de codificar una de ellas y en mis pruebas todo ha sido satisfactorio.

Aqui dejo el script para que lo probes por vos mismo y que lo adaptes a tus necesidades.

Código SQL [-]
Create table tabla1 (
  contador  integer not null primary key,
  campo1 varchar(50),
  campo2 varchar(50)
);

insert into tabla1
values (10, 'diez', 'diez');

insert into tabla1
values (20, 'veinte', 'veinte');

Set term ^ ;

create procedure Tabla_Secuenciada as Begin exit; end^

set term ; ^

commit;

Set term ^ ;

Alter procedure Tabla_Secuenciada
(
  contador_ini integer,
  contador_fin integer
)
returns
(
  contador integer,
  Campo1 Varchar(50),
  Campo2 VarChar(50)
)
AS
  declare variable contador_temp integer;
  declare variable campo1_temp varchar(50);
  declare variable campo2_temp varchar(50);

Begin
/* retornar :contador, :campo1 y :campo2 */
  contador = contador_ini - 1;
  for Select contador, campo1, campo2
        from tabla1
       where contador between :contador_ini and :contador_fin
        into :contador_temp, :campo1_temp, :campo2_temp
  do
  Begin
    contador = contador + 1;
    if (contador_temp > contador) Then
    begin
      campo1 = null;
      campo2 = null;
      while (contador < contador_temp) do
      Begin
        suspend;
        contador = contador + 1;
      end
    end
    /* cuando llegamos a este punto, :contador siempre será igual a :contador_temp */
    contador = contador_temp;
    campo1 = campo1_temp;
    campo2 = campo2_temp;
    suspend;
  end
  /* al llegar a este punto es probable que no se halla alcanzado el contador final, rellenar */
  if (contador_fin > contador) Then
  begin
    campo1 = null;
    campo2 = null;
    while (contador < contador_fin) do
    Begin
      contador = contador + 1;
      suspend;
    end
  end
end
^

set term ; ^

commit;


select * from tabla_secuenciada(1, 5);
select * from tabla_secuenciada(10, 10);
select * from tabla_secuenciada(10, 20);
select * from tabla_secuenciada(5, 25);
select * from tabla_secuenciada(15, 20);
select * from tabla_secuenciada(15, 25);
select * from tabla_secuenciada(21, 25);
select * from tabla_secuenciada(25, 25);

Espero sea de ayuda para vos y para la comunidad.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita