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] > > > > > > > > > > > > > > > > > > > > > > > > > > > >