Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why I obtain this "SQLSyntaxErrorException: ORA-00933: SQL command not properly ended" when I try to perform this JDBC query?

I have some problem trying to implement a simple JDBC query into a Java application.

So I have the following query:

SELECT   D.*
FROM   coda_tx c, documenti_tx d
WHERE   C.FK_TIPO_DOC = 99
        AND C.FK_STATO = 1
        AND C.FK_PIVA_MITTENTE = '05779711000'
        AND C.PK_CODA = D.PFK_CODA
        AND C.CANALE='STA'

If I run it into Oracle SQL Developer it run well and I obtain 2 records as result.

So I have to implement this query into a DAO class of my application in which I definied the following method:

public void getListaFatturePDF(String partitaIva) {
    System.out.println("INTO ottieniListaFatturePDF()");

    Blob blobPdf;
    String sql;

    StringBuffer sb = new StringBuffer();
    sb.append("SELECT D.*");
    sb.append("FROM coda_tx c, documenti_tx d");
    sb.append("WHERE C.FK_TIPO_DOC = 99");
    sb.append("AND C.FK_STATO = 1");
    sb.append("AND C.PK_CODA = D.PFK_CODA");
    sb.append("AND C.CANALE='STA'");
    sb.append("AND C.FK_PIVA_MITTENTE = '");
    sb.append(partitaIva);
    sb.append("';");

    sql = sb.toString();

    try {
        statment = connection.createStatement();
        ResultSet rs = statment.executeQuery(sql);
        System.out.println("ResultSet obtained");
    } catch (SQLException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }

}

The problem is that when I try to perform the previous method is thrown the following SQLException:

java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:30)
    at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:762)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111)
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1309)
    at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:422)
    at DAO.FatturaDAO.getListaFatturePDF(FatturaDAO.java:43)
    at mainPkg.Main.main(Main.java:74)

Why? I think that maybe is something wrong in the SQL syntax but I am not sure about it (because if I perform the query into Oracle SQL Developer it works fine) What am I missing? How can I fix it?

Tnx

like image 214
AndreaNobili Avatar asked Feb 16 '15 15:02

AndreaNobili


2 Answers

executeQuery() automatically adds a semicolon to a statement when executing it.

Change the line sb.append("';"); to sb.append("'");.

Also you'll need to add spaces at the end or at the beginning of each line, your statements are invalid otherwise.

like image 193
daZza Avatar answered Sep 19 '22 02:09

daZza


Add a white space at the end of each line so that the keyword on the next line is not clumped with it, e.g.:

sb.append("SELECT D.* ");

instead of

sb.append("SELECT D.*");

and also remove the trailing semicolon.

like image 20
David Levesque Avatar answered Sep 18 '22 02:09

David Levesque