Valor diferente ao rodar query na function

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
dark neo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 27 Set 2012 3:06 pm

Pessoa estou com esta function ele esta se comportando de maneira estranha...

segue abaixo:

Selecionar tudo


create or replace function INTERVALO2(dt_ini in Date, dt_fim in Date)
return NUMBER
as

vHORAS_UTEIS_TOTAL NUMBER := 0;
vHoras_Uteis_SD_F  NUMBER := 0;
VIntervalo NUMBER := 0;
data1 Date;

vdia varchar2(10);
vferiado INTEGER;
begin

data1 := dt_ini;

--SELECT TO_NUMBER( (dt_ini - dt_fim)) * 12 INTO vHoras_Uteis_Total
--FROM DUAL;


with t0 as (
select 
  to_date(dt_ini,'dd/mm/yyyy hh24:mi:ss') data_inicial, 
  to_date(dt_fim,'dd/mm/yyyy hh24:mi:ss') data_final
from dual),
t1 as (
select data_final - data_inicial diferenca from t0
)
select 
  trunc(diferenca)*12 + trunc((diferenca - trunc(diferenca))*24) horas INTO vHoras_Uteis_Total
from t1;

dbms_output.put_line(vHoras_Uteis_Total);

WHILE (data1 <= dt_fim)
LOOP
      SELECT TO_CHAR(TO_DATE (data1), 'D')
      INTO vdia
      FROM DUAL;

      -- verificando se na data passada é sabado ou domingo
      IF vdia IN (1,7) THEN
         vHoras_Uteis_SD_F := vHoras_Uteis_SD_F + 12;
      ELSE
         SELECT COUNT(*) INTO vferiado
         FROM feriado
         WHERE dataferiado >= to_date(data1)
               AND dataferiado < to_date(data1) + 1;

          IF vferiado = 1 THEN
             vHoras_Uteis_SD_F := vHoras_Uteis_SD_F + 12;
          END IF;
       END IF;

      data1 := data1 + 1;
END LOOP;

VIntervalo := vHoras_Uteis_Total - vHoras_Uteis_SD_F;
return VIntervalo;

EXCEPTION
  WHEN PROGRAM_ERROR THEN 
       RAISE_APPLICATION_ERROR(-21000,'Ocorreu um erro Interno ao executar este função'); 
end INTERVALO2;

o que acontece tenho esta query

Selecionar tudo

with t0 as (
select 
  to_date('01/10/2012 08:00:00','dd/mm/yyyy hh24:mi:ss','dd/mm/yyyy hh24:mi:ss') data_inicial, 
  to_date('01/10/2012 20:00:00','dd/mm/yyyy hh24:mi:ss','dd/mm/yyyy hh24:mi:ss') data_final
from dual),
t1 as (
select data_final - data_inicial diferenca from t0
)
select 
  trunc(diferenca)*12 + trunc((diferenca - trunc(diferenca))*24) horas INTO vHoras_Uteis_Total
from t1;
se eu executo a query acima ele me retorna 12 horas entre os periodos passado
mais quando eu a coloco dentro da function ele me retona zero, a diferença é que dentro da fucntion e passo a variavel e não o valor marretado.

chamo a function desse jeito

Selecionar tudo

select INTERVALO2(to_date('02/06/2006 08:00:00','DD/MM/RRRR HH24:MI:SS'), 
to_date('02/06/2006 20:00:00','DD/MM/RRRR HH24:MI:SS')) from dual;
chamando assim ela me retorna zero, sera que alguém pode me ajudar??
abraço a todos!!

OBS: esta query de calculo de horas não é de minha autoria uma amigo do foram postou e eu a aproveite. :)
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olhando por alto, notei que a sua query dentro da function está fazendo TO_DATE() do parâmetro de entrada que já é um tipo Date, logo o Oracle fará uma conversão implícita com TO_CHAR e depois o seu TO_DATE... talvez esteja aí o problema: a conversão implícita.

Tenta retirar o TO_DATE, pois o tipo já é date.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes