当我尝试执行这个jdbc查询时,为什么我得到这个“SQLSynaxErrorException:ORA-00933:SQL命令没有正确结束”?

beq87vna  于 2022-10-04  发布在  Oracle
关注(0)|答案(4)|浏览(214)

我在尝试将简单的JDBC查询实现到Java应用程序中时遇到了一些问题。

因此,我有以下疑问:

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'

如果我运行它到Oracle SQL Developer,它运行得很好,我得到了2条记录。

因此,我必须将该查询实现到我的应用程序的DAO类中,在该类中我定义了以下方法:

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.
    }

}

问题是,当我尝试执行前面的方法时,抛出了以下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)

为什么?我认为这可能是SQL语法中的错误,但我不确定(因为如果我对Oracle SQL Developer执行查询,它工作得很好),我遗漏了什么?我怎么才能修好它?

TNX

fd3cxomn

fd3cxomn1#

executeQuery()在执行语句时会自动在语句中添加分号。

将行sb.append("';");更改为sb.append("'");

此外,您还需要在每行的末尾或开头添加空格,否则您的语句将无效。

ibrsph3r

ibrsph3r2#

在每一行的末尾添加一个空格,这样下一行上的关键字就不会与它聚集在一起,例如:

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

而不是

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

并删除尾随的分号。

ssm49v7z

ssm49v7z3#

这就是我的工作方式:查看对齐的查询SELECT、FROM、UNION等关键字必须与查询兼容。此外,还可以看到沿着这些关键字向下的白色/非常细的线条。重新调整对我很管用。最后,我去掉了末尾的;。

我所提到的都是关于.SQL文件。在常规的Java类中可能也会出现同样的问题。

mwg9r5ms

mwg9r5ms4#

分号是罪魁祸首,由于某些原因,带有;的SQL最后在我的Sprint引导服务中不起作用。一旦我把它取下来,它就工作得很好

相关问题