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