ORA-01722 - Invalid Number

15 respostas
major505

Olá povo.

eu tenho o seguinte código que é chamado em uma aplicação web:

final String sql = "UPDATE TABELA_X SET campo1= ? , " +
                "campo2 = ?, campo3 = ?, campo4 = ?, " +
                "campo5 = ?, campo6 = ?, campo7 = ? , " +
                "campo8 =?, campo9 = ? , campo10 = ? , campo11 = ?, " +
                "campo12 = ?, campo13= ?, campo14 = ?, campo15 = ?, " +
                "campo16 = ?, campo17 = ?, campo18 = ?, " +
                "campo19 = ? WHERE campo7 =? AND campo3=? " +
                "AND campo18=? AND campo19=?";
        
        //pegando uma conexão ativa com o banco de dados
        Conexao cx = new Conexao();
        Connection con = cx.getCon();
        
        PreparedStatement stm = null;
        
        try {

            con.setAutoCommit(false);
            
            stm = con.prepareStatement(sql);
            
            stm.setInt(1, 15);
            stm.setInt(2, 25);
            stm.setString(3, "332");
            stm.setInt(4, 6);
            stm.setInt(5, 5);
            stm.setInt(6, 3);
            stm.setString(7, "123");
            stm.setString(8, "7");
            stm.setString(9, "1");
            stm.setString(10, "2");
            stm.setString(11, "1");
            stm.setDouble(12, 33.10);
            stm.setDouble(13, 40.4);
            stm.setDouble(14, 70.7);
            stm.setDouble(15, 12.5);
            stm.setDouble(16, 11.2);
            stm.setDouble(17, 10.1);

O banco de dados sobre o qual ele atua é Oracle.
Esse código funciona em todos os computadores do meu trampo, mas quando eu faço a distribuição do arquivo .WAR no cliente ele da um problema nessa linha:

con.setAutoCommit(false);

Ele joga um SQLException com essa mensagem:
ORA-01722 - Invalid Number.

É estranho que esse problema geralmente ocorre na conversão de tipos feita pelo banco, mas no o problema acontece no auto commit… e mesmo que eu retire essa linha o problema passa a acontece na linha de baixo.

Eu simplesmente não estou consseguindo determinar a causa… Alguém sabe como resolver isso?

15 Respostas

Pedrosa

O seu ambiente esta idêntico ao do cliente, container, Oracle etç?

Tente colocar essa linha, depois do seu último parâmetro:

stm.setDouble(17, 10.1);
stm.execute();
major505

Sim. Mesma versão do oracle, ambos rodando na mesma versão do Tomcat… tudo.
O mais estranho de tudo isso é que códigos semelhantes (que fazem updates da mesma forma) funcionam em outras partes do sistema, sem nenhum problema.

Pedrosa

De alguma forma as tabelas no seu cliente parecem estarem diferentes do seu ambiente, pois vc ta passando parametros inválidos.

http://ora-01722.ora-code.com/

major505

Bom, eu imaginei que fosse esse o problema mas as tabelas estão iguais… eu chequei. Mesmos campos - dos mesmos tipos, mesmas chaves, iguais. Usei o mesmo script para criar as tabelas lá e aqui.

M

Já ocorreu isso comigo e foi o seguinte, na sua tabela o campo é number, mas no seu método vc seta como String (stm.setString(11, “1”);), confira os tipo de campos da tabela com os tipos de atributos caso seja algum number apenas modifique stm.setInt(11, 1);

major505

Vlw a tentativa pessoal mas mesmo alterado o código não funciona. Além do mais se fosse isso o problema, aconteceria em qualquer computador e não apenas no cliente. Também, a exceção é jogada antes de chegar no setString. Na hora de dar o setAutoCommit.
deve ser outra coisa…

Pedrosa

Cara esses seus pametros são harcodes mesmo?

stm.setInt(1, 15);
             stm.setInt(2, 25);
             stm.setString(3, "332");
             stm.setInt(4, 6);
             stm.setInt(5, 5);
             stm.setInt(6, 3);
             stm.setString(7, "123");
             stm.setString(8, "7");
             stm.setString(9, "1");
             stm.setString(10, "2");
             stm.setString(11, "1");
             stm.setDouble(12, 33.10);
             stm.setDouble(13, 40.4);
             stm.setDouble(14, 70.7);
             stm.setDouble(15, 12.5);
             stm.setDouble(16, 11.2);
             stm.setDouble(17, 10.1);

Se a resposta for sim, crie uma stored procedure e resolve seu problema, os parametros ficariam nela.

major505

Não, eu apenas pus os mesmos valores que estavam na hora em que eu fiz o teste. Fiz isso pra tentar facilitar a leitura do código aqui.

brunosps

Cara pode parecer bobeira …
mas me responda … qual é o tipo dos campos na tabela ?
int ?
number ?

pode ser isso que está dando problema …
em oracle … para não ter maiores transtornos crio as tabelas de campo int como number(10,0) …

vc tem algum script de criação dessa tabela ?

espero ter ajudado…

major505

Não tenho mais o script mas eu dei um desc na tabela e são todos number.

brunosps

Number(10) ???

tenta

ALTER TABLE TABELA MODIFY CAMPO NUMBER(10,0)

em todos os campos number…
e testa tua aplicação.

falow …

major505

Não, num funcionou…

P

Também estou enroscado com o mesmo problema, só que passo alguns campos String e outros double. Será o double não é “compatível” com o campo number(10) no Oracle?

brunosps

Caros … me desculpem … mas só agora vi o q pode acontecer …
é o seguinte …
number(10,0) = Integer e
number(15,2) = Numeric(15,2).

Se não me engano o tipo Double tem ponto flutuante não tem ?

pois é o problema está aí … tipos incompativeis …
se o campo é number(10,0) ou somente number(10) tente passar o parametro como int … se o parametro tiver de conter o ponto flutuante … então mude o tipo do campo … no banco de dados … ponha NUMBER(15,2)

blz …
agora dessa vez acho q funfa …
[]'s …

major505

Não, tb não funcionou…
Seguinte a tabela aqui está identica a de lá. Se aqui funciona, o problema não deve ser no tipo dos dados…

Criado 5 de maio de 2006
Ultima resposta 5 de mai. de 2006
Respostas 15
Participantes 5