Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/07/2012, 18:23
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Consulta dentro de un While

El resultado de un SELECT dentro de un bloque PL/SQL siempre tiene que almacenarse dentro de una variable, que puede ser de tipo simple (varchar, number, etc), de tipo colección (arrays, tables, etc) o de tipo puntero (cursor), por ejemplo:

1. Tipo Simple, el select solo puede devolver un registro que se almacena en la variable var_equip y se produce un error si devuelve más de uno o ninguno.

Código:
declare
 var_equip msf600.equip%type;
begin
 select msf600.equip into var_equip 
 from msf600
 where id_msf600 = 1;

 dbms_output.put_line( var_equip );
end;
2. Tipo Colección, el select puede devolver ninguno, uno o varios registros que se almacenan simultáneamente en la variable var_equip.

Código:
declare
 type t_equip is table of msf600.equip%type index by pls_integer;
 var_equip t_equip;
begin
 select msf600.equip bulk collect into var_equip 
 from msf600;

 forall i in var_equip.first .. var_equip.last
  dbms_output.put_line( var_equip(i) );
end;
3. Tipo Puntero, el select puede devolver ninguno, uno o varios registros, pero la variable var_equip solo puede almacenar uno por vez, el resto se los referencia a la tabla con un puntero (también puedes combinar los cursores con las colecciones).

Código:
declare
 cursor c_equip is select msf600.equip from msf600;
 var_equip msf600.equip%type;
begin
 open c_equip;
 loop
  fetch c_equip into var_equip;
  exit when c_equip%notfound;
  dbms_output.put_line( var_equip );
 end loop;
end;

--o bien, un código más simple
begin
 for c_equip in ( select msf600.equip from msf600 ) loop
  dbms_output.put_line( c_equip.equip);
 end loop;
end;
Saludos