for loop

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
numerus
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 71
Registrado em: Seg, 23 Mai 2011 11:56 am
Localização: SP

Ola pessoal preciso de mais uma ajuda de vocês...
preciso que este for funcione... mas ta dando erro de numeric 9:17:28

Selecionar tudo

ORA-01426: numeric overflow
como posso corrigir este problema de conversão de variaveis?

Selecionar tudo

declare 
v_sysdate_before varchar2(100) := TO_char(SYSDATE - 1, 'YYYYMMDDHH24MI');
v_sysdate_after  varchar2(100) := TO_char(SYSDATE - 1, 'YYYYMMDDHH24MI');

begin 
 
  for i in TO_NUMBER(v_sysdate_before)..TO_NUMBER(v_sysdate_after) loop
  
  dbms_output.put_line(i);
  
  end loop;
end;
abraços,
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

Cara,

qual é a finalidade desse pl? talvez de outra forma seja mais fácil

o que está estourando é o limite do FOR.. ( 201.110.231.028 )

Selecionar tudo

declare 
v_sysdate_before varchar2(100) := TO_char(SYSDATE - 1, 'YYYYMMDDHH24MI');
v_sysdate_after  varchar2(100) := TO_char(SYSDATE - 1, 'YYYYMMDDHH24MI');
begin 
  
  for i in 201110231028.. 201110231028 loop
  
  dbms_output.put_line(i);
  
  end loop;

end;
vlw!
numerus
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 71
Registrado em: Seg, 23 Mai 2011 11:56 am
Localização: SP

então brother tenho um diretorio que vai cair um arquivo la a cada 2 horas o nome é ...201110241048 tem um nome e a data e hora para diferenciar.
Precisava de um for para ler rm dia antes caso desse algum problema no job na procedure em alguma coisa, sacou?
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 99
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

você está estourando o limite dos valores usados no loop. http://download.oracle.com/docs/cd/B193 ... tement.htm

Tente desta forma:

Selecionar tudo

declare 
  v_sysdate_before varchar2(100) := TO_char((SYSDATE - 1), 'YYYYMMDDHH24MI');
  v_sysdate_after  varchar2(100) := TO_char((SYSDATE - 1), 'YYYYMMDDHH24MI');  
  contador         number;

begin
  contador := v_sysdate_before-v_sysdate_after;

  if contador = 0 then
    contador := 1;
  end if;

  for i in 1..contador loop  
    dbms_output.put_line(i);      
  end loop;
end;
Boa sorte
numerus
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 71
Registrado em: Seg, 23 Mai 2011 11:56 am
Localização: SP

cara preciso imprimir a data de 201110231117 (ano, mês, dia, hora, minuto) até 201110241117.... tipo

Selecionar tudo

201110231117
201110231118
201110231119
201110231120
201110231121
201110231122
...
entende?
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

Cara,

tenta adaptar para sua realidade, acredito que seja mais ou menos isso que você precisa..

Selecionar tudo

declare 
vNomeArquivo     VARCHAR2(200);
vMinutos         NUMBER := 24*60;  -- =1440=1dia;
begin 

  for i in 1.. vMinutos loop
    
    vNomeArquivo := to_char((to_date('01/01/2011 00:00','dd/mm/yy hh24:mi') + 1/24/60 * i),'ddmmyyyy hh24mi');
    dbms_output.put_line(vNomeArquivo);
  
  end loop;
end;
se precisar de uma mão é só falar,

vlw!
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

Corrigindo linha 8,

Selecionar tudo

vNomeArquivo := to_char((to_date('01/01/2011 00:00','dd/mm/yy hh24:mi') + 1/24/60 * i) -1,'ddmmyyyy hh24mi') ;
numerus
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 71
Registrado em: Seg, 23 Mai 2011 11:56 am
Localização: SP

cara eu precisava que isso funcionasse assim:
com uma data anterior a data presente.

Selecionar tudo

declare 
vNomeArquivo     VARCHAR2(200);
vMinutos         NUMBER := 24*60;  -- =1440=1dia;
begin 

  for i in 1.. vMinutos loop
    
    vNomeArquivo := to_char((to_char(sysdate,'yyyymmddhh24mi' - 1) + 1/24/60 * i),'yyyymmddhh24mi');

    dbms_output.put_line(vNomeArquivo);
  
  end loop;
end;
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

beleza, está aí,

era isso??

Selecionar tudo

declare 
vNomeArquivo     VARCHAR2(200);
vMinutos         NUMBER := 24*60;  -- =1440=1dia;
begin 

  for i in 1.. vMinutos loop
    
    vNomeArquivo := to_char((to_date(to_char(SYSDATE,'dd/mm/yyyy hh24:mi'),'dd/mm/yy hh24:mi') + 1/24/60 * i) -1,'ddmmyyyy hh24mi') ;
    dbms_output.put_line(vNomeArquivo);
  
  end loop;
end;
numerus
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 71
Registrado em: Seg, 23 Mai 2011 11:56 am
Localização: SP

então preciso que a data inicial tipo 23/10/2011 as 14:52 já ate 24/10/2011 as 14:22.
esta fechando no começo do proximo dia.
numerus
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 71
Registrado em: Seg, 23 Mai 2011 11:56 am
Localização: SP

então preciso que a data inicial tipo 23/10/2011 as 14:52 vá ate 24/10/2011 as 14:22.
esta fechando no começo do proximo dia.
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

não entendi a pergunta,

ele está pegando 24h para traz,

231020111217 à 241020111216,

12:17 de ontem até 12:16 de hoje!

qual intervalo você precisa?
numerus
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 71
Registrado em: Seg, 23 Mai 2011 11:56 am
Localização: SP

é isso mesmo mano brown... na mosca!!!!! certinha valeu brother....
Responder
  • Informação