java.sql.SQLException:ORA-00933:使用getGeneratedKeys时SQL命令未正确结束

sam*_*pes 5 java sql database oracle jdbc

当我使用以下查询时,它的工作原理.

query = "INSERT INTO MLRL1_PSR_MASTER (PROJECT_ID,FROM_DATE,TO_DATE,TEMPLATE_ID,TEMPLATE_TYPE,UPLOADED_BY,PSR_SLABID) " +
        " select '"+projectId+"' , FROM_DATE , TO_DATE,'"+templateId+"','"+tempType+"','"+user.getUserID()+"', "+slabId+
        " from MLRL1_PSR_SLABS where SLAB_ID="+slabId+" ";

stmt = connection.prepareStatement(query, new String[] { "ID" });
stmt.executeUpdate();
stmt = connection.prepareStatement(query);
Run Code Online (Sandbox Code Playgroud)

但如果我使用与getGeneratedKeys()相同的查询:

stmt = connection.prepareStatement(query, new String[] { "ID" });
stmt.executeUpdate();
ResultSet rs = stmt.getGeneratedKeys();

while (rs.next()) {
    masterId = rs.getInt(1);
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

ORA-00933:SQL命令未正确结束

stmtjava.sql.PreparedStatement,遵守守则是1.6和JRE是67年7月1日Oracle驱动程序是odbc6和数据库是Oracle数据库11g企业版发布11.2.0.1.0

Adr*_*uer 6

ResultSet rs = stmt.getGeneratedKeys();
Run Code Online (Sandbox Code Playgroud)

JDBC 驱动程序将添加 'RETURNING 。. . 进入 。. ' 到您提供的查询的末尾,以便返回要求的值。在您的情况下,由于您没有指定自己的列,因此指定了始终为 INSERT 生成的 SLAB_ID。当 'RETURNING ..' 添加到查询的末尾时,结果语法无效,并为您提供错误消息。

ORA-00933: SQL 命令未正确结束

返回。. . 仅支持 INSERT...VALUES;也就是说,对于使用 VALUES 子句提供要插入的值的 INSERT 语句。使用子查询的插入不支持该语法。

请参阅 Oracle SQL 参考https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#SQLRF01604 中INSERT 语句的语法图

请注意,'returning_clause' 仅显示在 'values_clause' 行上,而不显示在 'subquery' 行上。

不支持您尝试使用的语法。

您可以在以下位置阅读更多信息:

http://database.developer-works.com/article/16369238/INSER+INTO+with+SELECT+is+throwing+error

https://community.oracle.com/thread/1325790


小智 -3

我认为语法不正确。您可能需要在查询中添加“VALUES”。插入查询应类似于 - INSERT INTO TABLE_NAME VALUES ();

  • 语法正确。特别是当我说它无需自动生成的密钥即可工作时。 (2认同)