我将 SQL 查询存储在资源文件中,格式非常人性化(带有换行符和缩进)。突然我遇到了一个问题:简单的查询(如下所示)无需通过 keyholder 获取生成的代码列值即可正常工作,
insert into
my_table
(
code
)
values
(
my_table_seq.nextval
)
但当密钥持有者使用以下方法时,返回 ORA-00931: missing identifier\n:
...
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 返回“\n”而不是“MY_TABLE”(见下图)!删除空格解决了这个问题。
是的...代码会查找
INSERT
然后INTO
跳过空格字符,并假设下一个非空格字符是表名标识符的开头。当它找到换行符时,它会假设这是标识符的开头,并返回单个换行符而不是实际标识符。它应该做的是跳过空格字符,而不仅仅是空格。(该方法还有更多问题,包括:更改标识符的大小写
(
;在标识符末尾查找空格字符或其他空格字符;并INSERT
在INTO
字符串中的任何位置而不是仅在开头进行查找。)但是......解决方法很简单,不要使用非空格空白字符
INSERT INTO my_table (
,只需在关键字和标识符之间使用空格(并且它也不适用于用引号括起来的混合大小写标识符,只需使用不带引号的标识符)。所以,是的,您可以报告它,但与此同时,您应该能够轻松修复您的代码,这样它就不会触发问题。