CarolinaZ 0 Denunciar post Postado Julho 5, 2011 Boa tarde pessoal, Estou com um problema com o sum do meu select. Quero somar um campo de moeda, que defini como VARCHAR2, quando executo minha query no banco de dados ela atrás o resultado certo, porém quando coloco a query na minha procedure, ela compila normalmente, mas a hora que executo o sistema onde a query está me retorna esse INVALID NUMBER, já tentei de várias maneiras retirar esse erro, mas ele persiste. Estou usando PL/SQL. Minha query é a seguinte: SELECT TO_CHAR(SUM(TO_NUMBER(OFU.CUS_UNI)), '999,999,999.99') SOMA_TRANS INTO V_SOMA_TRANS FROM R_XXOFU_017 OFU WHERE NRORC = V_OFU017.NRORC AND TO_NUMBER(NRVERSAO) = (SELECT MAX(TO_NUMBER(NRVERSAO)) FROM R_XXOFU_017 WHERE NRORC = V_OFU017.NRORC); Já tentei retirando o TO_CHAR, e de várias outras formas, mas não consigo trazer resultado na procedure com ela. Poderiam me ajudar, por favor?! Obrigada, Carol Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 5, 2011 O erro pode ser : Na conversão de OFU.CUS_UNI ou de NRVERSAO para numérico, algumas das linhas não puderam ser convetidas. Qual o tpo de V_SOMA_TRANS ? Por que não usa formato NUMBER para os valores e trata na aplicação o formato de MOEDA ? Compartilhar este post Link para o post Compartilhar em outros sites
CarolinaZ 0 Denunciar post Postado Julho 5, 2011 Boa tarde Motta, o NRVERSAO concerteza não é, porque uso ele dessa mesma forma em outras funções, e ocorre tudo bem. o V_SOMA_TRANS é VARCHAR2 também. Não entendo porque possa estar dando esse erro.. O meu campo é varchar2 na tabela, porém os dados que ele guarda não tem vírgula nem nada, nesse teste que estou fazendo para o sistema, estou tentando dar um sum nesses valores: 172.5 160 1.13 54.95 1082.92 Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 5, 2011 Tente declare vs_aux1 varchar2(255); vn_aux number; begin for r in (SELECT OFU.CUS_UNI FROM R_XXOFU_017 OFU WHERE NRORC = V_OFU017.NRORC AND TO_NUMBER(NRVERSAO) = (SELECT MAX(TO_NUMBER(NRVERSAO)) FROM R_XXOFU_017 WHERE NRORC = V_OFU017.NRORC)) LOOP vs_aux := R.CUS_UNI; vn_aux := TO_NUMBER(OFU.CUS_UNI); END LOOP; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(vs_aux); END; Lembre de dar set serveroutput on; Vai mostar a linha que dá erro. Compartilhar este post Link para o post Compartilhar em outros sites
CarolinaZ 0 Denunciar post Postado Julho 5, 2011 Executei esse script que você falou, arrumei os errinhos para rodar, mas não retornou informação nenhuma.. :\ Não sei mais o que fazer, parece que não tem sentido.. Estou pensando se não pode ser algo da procedure, porém tenho outra query muito parecida com essa logo abaixo, porém de outra tabela, mas funciona normalmente. CONSEGUI PARCIALMENTE.. Estava fazendo mais alguns testes e percebi que o problema era por causa desse valor de 4 dígitos antes do ponto (1082.92). Ai resolvi fazer um teste trocando o ponto por vírgula, ai quando executei a procedure funcionou normalmente, e me trouxe a soma dos valores como eu queria, mas quando fui executar a mesma query no banco solta, ai sim ela deu invalid number, portanto acredito que deve ser alguma configuração de idioma, pois português usa-se vírgula e inglês usa-se ponto, mas não entendi direito o porque, afinal o idioma do banco deve ser o mesmo da procedure que roda dentro do banco não?! A query que fiz e funcionou na procedure foi a seguinte: SELECT TO_CHAR(SUM(TO_NUMBER(REPLACE(OFU.CUS_UNI, '.', ','))), '999,999,999.99') SOMA_TRANS INTO V_SOMA_TRANS FROM R_XXOFU_017 OFU WHERE OFU.NRORC = V_OFU017.NRORC AND TO_NUMBER(OFU.NRVERSAO) = (SELECT MAX(TO_NUMBER(NRVERSAO)) FROM R_XXOFU_017 WHERE NRORC = V_OFU017.NRORC); Obrigada pela atenção Motta. Farei mais alguns testes para verificar se é problema de idioma mesmo. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 5, 2011 Um Alter Session antes da sessão configura isto. NLS_NUMERIC_CHARACTERS Mas o melhor, na minha modesta opinião, é trabalhar com valores numéricos pois evita estes problemas. Compartilhar este post Link para o post Compartilhar em outros sites