FOR STRING IN LIST

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Bom dia,

Dúvida básica: como fazer algo do tipo:

Selecionar tudo

for xstr in ('valor1', 'valor2', 'valor3') loop
  dbms_output.put_line(xstr);
end loop;
?
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Complementando: Sem SELECT FROM DUAL, de preferência :)
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Sem a DUAL, neste cenário que você apresentou, de loop, tem a saída com TYPE:

Selecionar tudo


declare
  type r is record (nro pls_integer);
  type t is table of r index by pls_integer;
  v t;
begin
  
  v(1).nro := 1;
  v(2).nro := 10;
  v(3).nro := 100;
  v(4).nro := 1000;  
  
  for z in 1..v.count loop
    dbms_output.put_line(v(z).nro);
  end loop;
end; 
Ou, com a própria DUAL:

Selecionar tudo

declare 
  cursor cteste
    is 
      select 1 as nro
        from dual
      union
      select 10 as nro
        from dual
      union
      select 20 as nro
        from dual;
    
begin
  for x in cteste loop
    dbms_output.put_line(x.nro);
  end loop;
end;

Fica ai aberto o POST para que demais foristas os ajude.
Só passa pra gente o que você realmente necessita, talvez tenha alguma outra saída.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Dependedo dos valores(se forem numéricos e sequenciais), acredito que isto funcione:

Selecionar tudo

BEGIN
  FOR i IN 1 .. 3
  LOOP
    dbms_output.put_line(i);
  END LOOP;
END;
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Simplificando um pouco o código do Trevisolli:

Selecionar tudo

DECLARE
   TYPE T IS TABLE OF VARCHAR2 (50)
      INDEX BY PLS_INTEGER;
   V   T;
BEGIN
   V (1) := 'texto1';
   V (2) := 'texto2';
   V (3) := 'texto3';
   V (4) := 'texto4';
   FOR Z IN 1 .. V.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE (V (Z));
   END LOOP;
END;
Poderia ser um VARRAY também.

Mas ainda assim não está simples de usar... Se não há, deveria haver um modo mais bonito.

Em Delphi posso fazer:

Selecionar tudo

const
 y: array [0..1] of String = ('valor1', 'valor2');

procedure LoopInArray;
var
  x: String;
begin
  for x in y do
    ShowMessage(x);
end;
Responder
  • Informação