Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

CarolinaZ

ORA01722: Invalid Number em PL/SQL

Recommended Posts

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.