Chiapa, boa tarde!!

Muiiiiiiiiiiiiiiiito obrigado pelo retorno!!

Era exatamente isso!!

Desculpe a ignorância!!

Forte abraço amigo!!

Rafael



--- Em oracle_br@yahoogrupos.com.br, "J. Laurindo Chiappa" <jlchiappa@...> 
escreveu
>
> Aliás, um negócio meio Óbvio : se vc QUER ter casas decimais, Por Que 
> inclusive a função tá retornando inteiro ??? Veja o exemplo :
> 
> ==> como vc programou :
> 
> SCOTT@O11GR2:SQL>set serveroutput on
> SCOTT@O11GR2:SQL>select 5.95 from dual;
> 
>               5.95
> ------------------
>               5,95
> 
> SCOTT@O11GR2:SQL>variable r number;
> SCOTT@O11GR2:SQL>create or replace FUNCTION FUNC_TESTE RETURN integer AS
>   2     v_diferencaferia integer := 0;
>   3  BEGIN
>   4      dbms_output.put_line('Início, v_diferencaferia=' || 
> v_diferencaferia);
>   5      select 5.95 into v_diferencaferia from dual;
>   6     dbms_output.put_line('Após o select, v_diferencaferia=' || 
> v_diferencaferia);
>   7     return v_diferencaferia;
>   8  END;
>   9  /
> 
> Função criada.
> 
> SCOTT@O11GR2:SQL>exec :r := FUNC_TESTE;
> Início, v_diferencaferia=0
> Após o select, v_diferencaferia=6
> 
> Procedimento PL/SQL concluído com sucesso.
> 
> SCOTT@O11GR2:SQL>print r
> 
>                  R
> ------------------
>                  6
> 
> ==> usando o datatype CORRETO, que Permite decimais (no exemplo, sem 
> especificar máximo de decimais) :
> 
> SCOTT@O11GR2:SQL>create or replace FUNCTION FUNC_TESTE RETURN NUMBER AS
>   2     v_diferencaferia NUMBER := 0;
>   3  BEGIN
>   4      dbms_output.put_line('Início, v_diferencaferia=' || 
> v_diferencaferia);
>   5      select 5.95 into v_diferencaferia from dual;
>   6     dbms_output.put_line('Após o select, v_diferencaferia=' || 
> v_diferencaferia);
>   7     return v_diferencaferia;
>   8  END;
>   9  /
> 
> Função criada.
> 
> SCOTT@O11GR2:SQL>exec :r := FUNC_TESTE;
> Início, v_diferencaferia=0
> Após o select, v_diferencaferia=5,95
> 
> Procedimento PL/SQL concluído com sucesso.
> 
> SCOTT@O11GR2:SQL>print r
> 
>                  R
> ------------------
>               5,95
> 
> SCOTT@O11GR2:SQL>
> 
> []s
> 
>   Chiappa
> --- Em oracle_br@yahoogrupos.com.br, "J. Laurindo Chiappa" <jlchiappa@> 
> escreveu
> >
> >   Talvez por causa de :
> >   
> >   v_diferencaferia integer 
> >   
> >   ???
> >   
> >   INTEGER significa INTEIRO (sem casas decimais portanto) : se vc QUER ter 
> > casas decimais afaik vc deveria usar NUMBER....
> >   
> >    []s
> >    
> >      Chiappa
> > 
> > --- Em oracle_br@yahoogrupos.com.br, "ciadart" <rafael.henrique@> escreveu
> > >
> > > Chiapa, boa tarde!!
> > > 
> > > Olha que loucura... 
> > > 
> > > 
> > > debugando conforme orientação, se eu executar somente a query o resultado 
> > > é "5.95" e se eu executar a query dentro da function ele ***arredonda**** 
> > > o valor para "6".
> > > 
> > > Alguma ideia do que pode ser ?
> > > 
> > > Rafael
> > > 
> > > 
> > > -- resultado da execucao da query
> > > SQL> select sum(nvl(fi.nrdocumento,0)) v_diferencaferia
> > >       from dim_funcionarios f, fat_fichaconduta fi, dim_ocorrencias o
> > >       where 
> > >           fi.cdfuncionario_sk = f.cdfuncionario_sk and 
> > >           fi.cdocorrencia_sk = o.cdocorrencia_sk and 
> > >           fi.dtcompetencia = to_date('30/04/2013','DD/MM/YYYY') and
> > >           fi.cdfuncionario_sk = 4053 and
> > >           o.cdocorrencia = 204
> > >       group by f.cdfuncionario_sk  2    3    4    5    6    7    8    9  ;
> > > 
> > > V_DIFERENCAFERIA
> > > ----------------
> > >             5.95
> > > 
> > > 
> > > --resultado da execucao da function
> > > 
> > > create or replace FUNCTION SV_FLG_DIFERENCAFERIA (p_cdfuncionario_sk in 
> > > integer, p_dtcompetencia in varchar) RETURN integer AS
> > > 
> > > v_diferencaferia integer := 0;
> > > 
> > > BEGIN
> > >     dbms_output.put_line('Início, v_diferencaferia=' || v_diferencaferia);
> > >     
> > >     select sum(nvl(fi.nrdocumento,0)) into v_diferencaferia
> > >            from dim_funcionarios f, fat_fichaconduta fi, dim_ocorrencias o
> > >            where
> > >            fi.cdfuncionario_sk = f.cdfuncionario_sk and
> > >            fi.cdocorrencia_sk = o.cdocorrencia_sk and
> > >            fi.dtcompetencia = to_date(p_dtcompetencia,'DD/MM/YYYY') and
> > >            fi.cdfuncionario_sk = p_cdfuncionario_sk and
> > >            o.cdocorrencia = 204
> > >            group by f.cdfuncionario_sk;
> > >     
> > >     dbms_output.put_line('Após o select, v_diferencaferia=' || 
> > > v_diferencaferia); 
> > > 
> > > return v_diferencaferia;
> > > 
> > > END;
> > > 
> > > 
> > > SQL> exec :V_RETORNO := SV_FLG_DIFERENCAFERIA(4053 , '30/04/2013');
> > > Inicio, v_diferencaferia=0
> > > Apos o select, v_diferencaferia=6
> > > 
> > > PL/SQL procedure successfully completed.
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > --- Em oracle_br@yahoogrupos.com.br, "J. Laurindo Chiappa" <jlchiappa@> 
> > > escreveu
> > > >
> > > >   Bem, só observo que o SQL Developer 4 está em estágio de early 
> > > > adopter, não sei se já está estável o suficiente para uso diário... 
> > > > Anyway, a referência melhor para SQL Developer é 
> > > > http://www.thatjeffsmith.com/ : esse link é do blog do tech leader do 
> > > > time que desenvolve o SQL Developer, busca nele por DEBUG que vc acha 
> > > > diversos artigos e explicações, além de dicas de configuração e de uso 
> > > > do produto...
> > > >   E é claro : no caso que vc postou, que parece ser algo simples e 
> > > > curto, enquanto vc aprende a usar o SD vc poderia fazer via sqlplus 
> > > > enquanto isso, como te mostrei....
> > > > 
> > > >  []s
> > > >  
> > > >    Chiappa
> > > > 
> > > > --- Em oracle_br@yahoogrupos.com.br, "ciadart" <rafael.henrique@> 
> > > > escreveu
> > > > >
> > > > > Chiapa, bom dia!
> > > > > 
> > > > > Irei verificar todos os pontos considerados.
> > > > > 
> > > > > No meu caso eu utilizo o SQLDeveloper 4, porém não tenho conhecimento 
> > > > > de como fazer o debug com ele.
> > > > > 
> > > > > Vc teria algum manual ou link de algum site que ensine fazer o debbug 
> > > > > com esta ferramenta ?
> > > > > 
> > > > > Muito obrigado pelo retorno!
> > > > > 
> > > > > Rafael
> > > > > 
> > > > > 
> > > > > --- Em oracle_br@yahoogrupos.com.br, "J. Laurindo Chiappa" 
> > > > > <jlchiappa@> escreveu
> > > > > >
> > > > > >   A *** PRIMEIRA COISA *** que salta aos olhos é que, de maneira 
> > > > > > BEM ERRADA, vc ** SILENCIA ** qualquer erro com WHEN OTHERS : 
> > > > > > sabe-se lá se está dando algum erro que vc está perdendo.... PLZ 
> > > > > > remove isso ...
> > > > > >  
> > > > > >  Em segundo lugar, a técnica-PADRÃO para vc debugar lógica (que 
> > > > > > certamente deve ser o que está pegando aqui) é vc MOSTRAR via 
> > > > > > breakpoint/exibição de mensgaem/instrumentação/whatever exatamente 
> > > > > > AONDE a lógica está entrando, qual valor está sendo retornado.... 
> > > > > > 
> > > > > >  Se for sqlplus a tool que vc tem disponível, vc faria assim 
> > > > > > (conectado com o usuário correto, que tem todos os acessos, etc, 
> > > > > > etc) :
> > > > > >  
> > > > > >  => liga o output com :
> > > > > >  
> > > > > >   set serveroutput on
> > > > > >  
> > > > > > => executa o SELECT diretamente no sqlplus :
> > > > > >  
> > > > > > select
> > > > > > case when (v_diferencaferia >= 6) then -1
> > > > > > when (v_diferencaferia < 6) then 0
> > > > > > end case
> > > > > > from
> > > > > > (select sum(nvl(fi.nrdocumento,0)) v_diferencaferia
> > > > > > from dim_funcionarios f, fat_fichaconduta fi, dim_ocorrencias o
> > > > > > where
> > > > > > fi.cdfuncionario_sk = f.cdfuncionario_sk and
> > > > > > fi.cdocorrencia_sk = o.cdocorrencia_sk and
> > > > > > fi.dtcompetencia = to_date('30/04/2013','DD/MM/YYYY') and
> > > > > > fi.cdfuncionario_sk = 4053 and
> > > > > > o.cdocorrencia = 204
> > > > > > group by f.cdfuncionario_sk)
> > > > > > ;
> > > > > > 
> > > > > > => recria a Function com instrumentação :
> > > > > > 
> > > > > > create or replace FUNCTION SV_FLG_DIFERENCAFERIA 
> > > > > > (p_cdfuncionario_sk in
> > > > > > integer, p_dtcompetencia in varchar) RETURN integer AS
> > > > > > v_diferencaferia integer := 0;
> > > > > > BEGIN
> > > > > > -- apura se o colaborador teve diferenca de feria
> > > > > > -- se o resultado é 0 (zero) quer dizer que o colaborador nao teve
> > > > > > diferenca de feria abaixo de R$ 6,00
> > > > > > begin
> > > > > >    dbms_output.put_line('Início, v_diferencaferia=' || 
> > > > > > v_diferencaferia);
> > > > > >    select sum(nvl(fi.nrdocumento,0)) into v_diferencaferia
> > > > > >    from dim_funcionarios f, fat_fichaconduta fi, dim_ocorrencias o
> > > > > >    where
> > > > > >    fi.cdfuncionario_sk = f.cdfuncionario_sk and
> > > > > >    fi.cdocorrencia_sk = o.cdocorrencia_sk and
> > > > > >    fi.dtcompetencia = to_date(p_dtcompetencia,'DD/MM/YYYY') and
> > > > > >    fi.cdfuncionario_sk = p_cdfuncionario_sk and
> > > > > >    o.cdocorrencia = 204
> > > > > >    group by f.cdfuncionario_sk;
> > > > > >    --
> > > > > >    dbms_output.put_line('Após o select, v_diferencaferia=' || 
> > > > > > v_diferencaferia);
> > > > > > end;
> > > > > >    dbms_output.put_line('Vou executar case');
> > > > > >    case when (v_diferencaferia >= 6) then v_diferencaferia := -1;
> > > > > >    when (v_diferencaferia < 6) then v_diferencaferia := 0;
> > > > > >    end case;
> > > > > >    dbms_output.put_line('case colocou v_diferencaferia=' || 
> > > > > > v_diferencaferia);
> > > > > > return v_diferencaferia;
> > > > > > END;
> > > > > > 
> > > > > > => executa a function : como ela é uma FUNCTION, vc tem que criar 
> > > > > > uma variable de retorno no sqlplus, ou jogar a função num SELECT 
> > > > > > from dual, ou chamar a partir de um bloco anônimo.... Eu prefiro 
> > > > > > criar a variable :
> > > > > > 
> > > > > >  variable V_RETORNO number;
> > > > > >  exec :V_RETORNO := SV_FLG_DIFERENCAFERIA(4053 , '30/04/2013');
> > > > > >  print V_RETORNO
> > > > > >  
> > > > > >  
> > > > > >  e veja o que vc vai ver, yes ???? 
> > > > > >  
> > > > > >   []s
> > > > > >   
> > > > > >     Chiappa
> > > > > > 
> > > > > > --- Em oracle_br@yahoogrupos.com.br, Rafael HM Pereira 
> > > > > > <rafael.henrique@> escreveu
> > > > > > >
> > > > > > > Pessoal, boa tarde!!
> > > > > > > 
> > > > > > > Estou com uma situação um tanto intrigante e não sei mais o que 
> > > > > > > fazer para
> > > > > > > tentar achar o erro.
> > > > > > > 
> > > > > > > Ao executar a query abaixo, ela me retorna corretamente o valor 
> > > > > > > "0" como
> > > > > > > resultado:
> > > > > > > 
> > > > > > > select
> > > > > > > 
> > > > > > > case when (v_diferencaferia >= 6) then -1
> > > > > > >        when (v_diferencaferia < 6) then 0
> > > > > > >   end case
> > > > > > > 
> > > > > > > from
> > > > > > > 
> > > > > > > (select sum(nvl(fi.nrdocumento,0)) v_diferencaferia
> > > > > > >       from dim_funcionarios f, fat_fichaconduta fi, 
> > > > > > > dim_ocorrencias o
> > > > > > >       where
> > > > > > >           fi.cdfuncionario_sk = f.cdfuncionario_sk and
> > > > > > >           fi.cdocorrencia_sk = o.cdocorrencia_sk and
> > > > > > >           fi.dtcompetencia = to_date('30/04/2013','DD/MM/YYYY') 
> > > > > > > and
> > > > > > >           fi.cdfuncionario_sk = 4053 and
> > > > > > >           o.cdocorrencia = 204
> > > > > > >       group by f.cdfuncionario_sk)
> > > > > > > 
> > > > > > > 
> > > > > > > Porém, após "encapsular" a query em uma function, o valor 
> > > > > > > retornado é
> > > > > > > sempre "-1", ou seja, um valor errado. Segue a function abaixo:
> > > > > > > 
> > > > > > > create or replace FUNCTION SV_FLG_DIFERENCAFERIA 
> > > > > > > (p_cdfuncionario_sk in
> > > > > > > integer, p_dtcompetencia in varchar) RETURN integer AS
> > > > > > > 
> > > > > > > v_diferencaferia integer := 0;
> > > > > > > 
> > > > > > > BEGIN
> > > > > > > 
> > > > > > >   -- apura se o colaborador teve diferenca de feria
> > > > > > >   -- se o resultado é 0 (zero) quer dizer que o colaborador nao 
> > > > > > > teve
> > > > > > > diferenca de feria abaixo de R$ 6,00
> > > > > > >   begin
> > > > > > > 
> > > > > > >       select sum(nvl(fi.nrdocumento,0)) into v_diferencaferia
> > > > > > >       from dim_funcionarios f, fat_fichaconduta fi, 
> > > > > > > dim_ocorrencias o
> > > > > > >       where
> > > > > > >           fi.cdfuncionario_sk = f.cdfuncionario_sk and
> > > > > > >           fi.cdocorrencia_sk = o.cdocorrencia_sk and
> > > > > > >           fi.dtcompetencia = 
> > > > > > > to_date(p_dtcompetencia,'DD/MM/YYYY') and
> > > > > > >           fi.cdfuncionario_sk = p_cdfuncionario_sk and
> > > > > > >           o.cdocorrencia = 204
> > > > > > >       group by f.cdfuncionario_sk;
> > > > > > > 
> > > > > > >       exception when OTHERS then v_diferencaferia := 0;
> > > > > > >   end;
> > > > > > > 
> > > > > > >   case when (v_diferencaferia >= 6) then v_diferencaferia := -1;
> > > > > > >        when (v_diferencaferia < 6) then v_diferencaferia := 0;
> > > > > > >   end case;
> > > > > > > 
> > > > > > >   return v_diferencaferia;
> > > > > > > 
> > > > > > > END;
> > > > > > > 
> > > > > > > 
> > > > > > > Não sei mais o que fazer e ou o que validar. Se alguem puder me 
> > > > > > > dar uma luz
> > > > > > > ficarei grato.
> > > > > > > 
> > > > > > > Muito obrigado
> > > > > > > 
> > > > > > > -- 
> > > > > > > Att,
> > > > > > > 
> > > > > > > Rafael HM Pereira
> > > > > > > 
> > > > > > > Linux User Id: 360166
> > > > > > > Skype: rafaelhmpereira
> > > > > > > MSN: rafael.henrique@
> > > > > > > Blog: http://rafaelhmpereira.blogspot.com
> > > > > > > LinkedIn: http://br.linkedin.com/in/rafaelhmpereira
> > > > > > > (27) 9233-0734 / (27) 3328-4320
> > > > > > > 
> > > > > > > 
> > > > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>


Responder a