Erro ORA-01722 - Como debugar erro oracle na aplicação

Olá,

estou tendo um problema em um select.

O erro apresentado é o seguinte:

java.sql.SQLSyntaxErrorException: ORA-01722: invalid number

Pesquisando, vi que é um erro simples, http://www.orafaq.com/wiki/ORA-01722, li em vários sites a explicação, mas ainda não encontrei o culpado.

Minha aplicação é um console, importador e exportador em java, com banco de dados Oracle, usando JDBC.

Não consegui reproduzir o erro até o momento,

fiz testes em minha máquina e em outros ambientes acessando uma cópia da base de produção,

sendo que essa base cópia, segundo o DBA está com as mesmas configurações da base de produção.

Resumindo o erro só ocorre quando a aplicação em produção tenta executar esse select, se eu pegar a sql preencher e executar funciona corretamente.

Já coloquei logs para me mostrar o conteúdo que estou setando nas cláusulas where, e estes aparentemente são os esperados e com tamanho correto.

O erro começou a ocorrer no início do mês, e tem vezes que executa a sql corretamente.

Um dos suspeitos da sql é essa subtração na data, mas porque o erro só ocorre de vez em quando?

PV.DT_CREDITO_PARCELA = to_date(?, ‘dd/MM/yy’)-?

Também identifiquei no join a comparação abaixo, onde pdv.nr_convenio, acaba sofrendo to_number pois na base é varchar,

pesquisei na base de produção por to_number(nr_convenio) from pdv, e não obtive erro:

CON.CD_CONVENIO = pdv.nr_convenio

Então minha dúvida é, como conseguir debugar essa sql dentro da aplicação, para poder realmente saber o que, e como está ocorrendo nas internas da execução do select?

Você utiliza o MESMO driver jdbc que está rodando na produção?

Já tive tantos problemas com o driver jdbc da Oracle que hoje em dia, qualquer problema com o banco, primeiro culpo ele, depois culpo a aplicação.

Sim, é o mesmo driver no desenvolvimento, homologação e produção.

Olá

O idioma (locale) dos sistemas operacionais estão iguais?

Confirmei aqui, todos os ambientes são pt-br ISO-8859-1.

Olá

Os parametros do banco (v$nls_parameters) tbém estão?

Aqui nós trabalhamos tudo em en-US, no seu caso acredito que deva estar tudo em pt-BR para não dar conflitos de ponto e virgula na separação de decimais.

Esse erro é mto chato de solucionar

o ideal mesmo é você criar um objeto java.sql.Date (mesmo que pela sua string) e ai da um setDate, e ai colocar a interrogação no lugar do seu to_date inteiro…

tipo trocar

to_date(?, ‘dd/MM/yy’)-?

por

?-?

e na primeira interrogação vc da um setDate onde imagino que vc tava dando um setString antes… ai a API abstrai pra gente.

Estou pensando em retirar essa subtração, e fazê-la no java.

Ficando to_date(?, ‘dd/MM/yy’)

Já que antes de ocorrer o erro já é usado to_date(?, ‘dd/MM/yy’), sem a ocorrência de erros…

Pelo que eu entendi este “to_date” ainda é um suspeito certo? Ou você já tem certeza que é ele?

Já pegou a query exata, no momento que ocorre o erro, e tentou executar no banco diretamente, para ver se funciona?

Todos são suspeitos rsrs

Eu peguei a query e preenchi na mão consultando a base cópia da produção, rodei no sql developer e funciona,
enviei para o dba executar na base de produão e também não deu erro…

Agora estamos realizando uma sessão de tracer na base de produção, para ver se encontramos mais alguma pista.

Mas enquanto isso fico imaginando o que poderia ser retirado de lógica do script sql para passar para java.
E entre eles tem essa subtração na data.

O mais estranho é que o problema não ocorre sempre.
Em um mesmo dia, utilizando uma mesma data de chamada ao exportador, ele gerou o arquivo corretamente, solicitei que tentassem novamente para a mesma data, e aí sim deu o erro.

Eu recomendo então que você tente descobrir exatamente a situação que causa o erro, antes de sair modificando o programa.

Vocẽ consegue simular o erro em homologação?

Na hora que der o erro em homologação, copie os valores dos parâmetros e tente rodar no mesmo ambiente.

Esse é o problema, na homologação com a cópia da base de produção o erro não ocorre,
no desenvolvimento via ide também não, usando o jar da produção no desenvolvimento acessando a base cópia da produção também não consegui simular…
Faz duas semanas que estou tentando simular, deixando os ambientes o mais parecido possível e nada do erro ocorrer aqui ou na homologação.

Por isso estou quase indo para a alteração da aplicação… mesmo assim nada garante que o erro pare, porque não sabemos que campo especifico está ocorrendo.
Mas toda tentativa é válida, já que estão cobrando solução.

Dando um UP no tópico, estou trabalhando com a Grazy na resolução do problema.

Estamos realizando Trace na sessão da aplicação pra tentar capturar os momentos aleatórios onde o erro ocorre. Qualquer novidade avisamos o pessoal aqui. Abraço!

Se eu fosse vocês a primeira coisa que eu faria era descobrir com certeza qual query está causando o erro…

Grave em log no momento que a exceção ocorrer, com os parâmetros passados, e aí terá uma idéia melhor do que acontece.