Erro de Caracter Inválido JDBC ORACLE ORA-00911

Estou tendo problemas de erros do driver JDBC do oracle:

[code]
java.sql.BatchUpdateException: ORA-00911: invalid character

at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:566)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9365)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:210)
at diegoqueres.gdd.dao.DocumentoPostadoDAO.inserirDocumentosPostados(DocumentoPostadoDAO.java:886)
at diegoqueres.gdd.dao.DocumentoPostadoDAO.executar_PROCESSO_ALIMENTACAO_BASE_MANUAL_02(DocumentoPostadoDAO.java:701)
at diegoqueres.gdd.interfaces.JFrameAdministrativo$13.run(JFrameAdministrativo.java:804)[/code]

O erro ocorre na última instrução do seguinte código, mas não estou conseguindo solucioná-lo. Verifiquei o sql e está sem “;”:

        PreparedStatement prepStmt =
                getConexaoBD().prepareStatement(
                "INSERT INTO CADBUSINESS.GDD_FONTE_DOCTOS_IMPRESSOS " +
                "( CIF,  BAN,  MOVIMENTO,  CICLO,  MES,  ANO,  TIPO_DOCTO,  FORNECEDOR, DATA_ARQUIVO_FONTE ) "
                + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");

        for (DocumentoPostado doc : documentosPostadosParaInclusao) {
            prepStmt.setString(1, doc.getCif());
            prepStmt.setLong(2, doc.getBan());
            prepStmt.setInt(3, doc.getMovimento());
            prepStmt.setByte(4, doc.getCiclo());
            prepStmt.setInt(5, doc.getMes());
            prepStmt.setInt(6, doc.getAno());
            prepStmt.setByte(7, doc.getTipoDoc());
            prepStmt.setString(8, doc.getFornecedor());
            prepStmt.setDate(9, new java.sql.Date(doc.getDataArquivoFonte().getTime()));

            prepStmt.addBatch();
        }   //fim do laço for
 
        //Instrução onde dá pau...
        int status[] = prepStmt.executeBatch();

Vocês podem ver que o SQL está aparentemente normal…

Esse seu campo Date ai, é realmente um sql.Date? Não seria um util.Date?

o JDBC so suporta o tipo java.sql.Date

exprimente verificar se alguns desses valores não foi preenchido, por exemplo se vc criar um campo

int x;

Qual o valor de x? o Valor é lixo, pois os tipos primitivos não aceitam null, esse lixo o banco não suporta, normalmente é em um formato ASCII, como vi que vc usa também o tipo byte, tens que dar uma olhada nesse caso tbm.

Por isso que eu digo, sacrifique milisegundos de performance e use os Wrappers.

Pois é galera…o erro está resolvido. E era de uma (desculpem a palavra…terei que empregá-la) escrotidão mórbida…
Depois que coloquei a mesma consulta dentro de uma string:

E gerei o PreparedStatement, funcionou:

É que na consulta anterior eu tinha usado “;” no final do sql. Depois retirei, mandei limpar todos os arquivos fonte, e compilei de novo, do jeito que postei antes. O compilador ainda estava interpretando que tinha um “;” mesmo que o arquivo já não tivesse mais (é sério. Eu salvei e compilei sem “;”). Sabe-se lá porquê… mas depois que joguei tudo para a nova String sql, o compilador interpretou que houve mudança e compilou atualizado o arquivo .class

O tipo é o java.sql.Date mesmo… e nessa forma, sempre deu certo e salvou o tipo java.util.Date corretamente (mas para isso, têm que ser salvo da forma que coloquei no código, chamando o getTime do java.util.Date e jogando no construtor do java.sql.Date.

2 curtidas