Springs 的 KeyHolder、oracle jdbс 和带有换行符的插入查询导致 ORA-00931:缺少标识符

问题描述 投票:0回答:1

我将 sql 查询存储在资源文件中,格式非常易于人类阅读(带有换行符和缩进)。突然我遇到了问题:简单的查询(如下所示)可以正常工作,无需通过密钥持有者获取生成的代码列值,

insert into 
my_table
(
  code
)
values
(
  my_table_seq.nextval
)

但返回 ORA-00931: 缺少标识符 使用钥匙扣时:

...
var keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
        "MY INSERT QUERY",
        new MapSqlParameterSource(),
        keyHolder,
        new String[]{"code"}
);
...

我调试了oracle jdbc驱动程序(ojdbc8/ojdbc10 19.24)并注意到into-keyword后面的空格导致了这种行为:AutoKeyInfo.getTableName return " “而不是“MY_TABLE”(见下图)!删除空格解决了问题。

它是bug吗(是否可以将其提交给ojdbc开发人员)? keyHolder fail

oracle-database jdbc spring-jdbc ojdbc
1个回答
0
投票

这是一个错误吗?

是的...代码先查找

INSERT
,然后查找
INTO
,然后跳过空格字符并假定下一个非空格字符是表名称标识符的开头。当它找到换行符时,它假定这是标识符的开头并返回单个换行符而不是实际标识符。

但是...解决方法很简单,不要在

INSERT INTO my_table
中使用换行符。


所以,是的,您可以报告它,但与此同时,您应该能够轻松修复代码,这样就不会触发问题。

© www.soinside.com 2019 - 2024. All rights reserved.