ORA-01722 - Invalid Number

15 respostas
M

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

P

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();
M

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.

P

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/

M

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);

M

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…

P

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.

M

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.

B

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…

M

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

B

Number(10) ???

tenta

ALTER TABLE TABELA MODIFY CAMPO NUMBER(10,0)

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

falow …

M

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?

B

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 …

M

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