我将 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”(见下图)!删除空格解决了问题。
这是一个错误吗?
是的...代码先查找
INSERT
,然后查找 INTO
,然后跳过空格字符并假定下一个非空格字符是表名称标识符的开头。当它找到换行符时,它假定这是标识符的开头并返回单个换行符而不是实际标识符。
但是...解决方法很简单,不要在
INSERT INTO my_table
中使用换行符。
所以,是的,您可以报告它,但与此同时,您应该能够轻松修复代码,这样就不会触发问题。