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

当我使用以下查询时,它可以工作。

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);

但是如果我对getGeneratedKeys()使用相同的查询,例如:

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

stmt.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();

while (rs.next()) {

masterId = rs.getInt(1);

}

我得到一个错误

ORA-00933: SQL command not properly ended

stmt是java.sql.PreparedStatement,代码合规性是1.6,JRE是1.7.67 Oracle Driver是odbc6,数据库是Oracle Database 11g企业版11.2.0.1.0

打印生成的SQL语句并手动运行。我很确定您会亲自看到该错误。您不应该首先连接用户输入,而是使用PreparedStatement

使用相同的串联(!)值,使用完全相同的生成字符串会得到不同的行为-还是它们不同?它们中是否包含引号,逗号或任何其他会使解析器混乱的内容(如果使用绑定变量,这将不成问题)?

@horse:打印生成的SQL语句并手动运行:它运行顺利。在我的SQL Developer。@ Aelx Poole:我知道我使用了准备好的语句,但是在查找问题时我尝试了不使用setXXX()的问题,还是行不通。

我不能复制这一点。您正在使用哪个版本的Java,哪个驱动程序(和版本)以及哪个Oracle版本? stmt是java.sql.PreparedStatement还是其他?

@Alex:stmt是java.sql.PreparedStatement,代码遵从性是1.6,JRE是1.7.67 Oracle Driver是odbc6,数据库是Oracle Database 11g企业版11.2.0.1.0

我的测试非常接近这一点。为了避免出现愚蠢/令人反感的问题,您确定错误来自该prepareStatement()调用-您以后没有添加其他代码,比如说要在另一条语句中使用masterid吗?还是getGeneratedKeys()调用实际上引发了错误?您能否添加一个完整的示例来说明该错误?

确保该语句中的变量slabId不为null或为空。如果为null / empty,则查询将像-WHERE SLAB_ID=那样结束。这可能会给您导致sql命令未正确结束的错误。正如AlexPoole所说的,使用绑定变量

伙计们系统查询运行在猛禽/ SQL开发人员上..

您是否尝试过添加尾随分号作为健全性检查?

ResultSet rs = stmt.getGeneratedKeys();

JDBC驱动程序将添加'RETURNING。 。 。进入。 '到您提供的查询的末尾,以返回所要求的值。

在您的情况下,指定了始终为INSERT生成的SLAB_ID,因为您没有指定自己的列。

在查询末尾添加" RETURNING .."时,生成的语法无效,并显示错误消息。

ORA-00933: SQL command not properly ended

正在返回。 。 。仅支持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

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

我认为语法正确,OP正在使用INSERT INTO table(...) SELECT ... FROM othertable语法

语法正确。 我在说Speciall时不需要自动生成的密钥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值