Eu armazeno consultas sql em arquivos de recursos com formatação bem legível para humanos (com quebras de linha e recuos). De repente, me deparei com um problema: consulta simples, como abaixo, funciona bem sem buscar o valor da coluna de código gerada via keyholder,
insert into
my_table
(
code
)
values
(
my_table_seq.nextval
)
mas retorna ORA-00931: identificador ausente\n quando o keyholder é usado:
...
var keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
"MY INSERT QUERY",
new MapSqlParameterSource(),
keyHolder,
new String[]{"code"}
);
...
Depurei o driver jdbc oracle (ojdbc8/ojdbc10 19.24) e notei que o espaço em branco após into-keyword causa esse comportamento: AutoKeyInfo.getTableName retorna "\n" em vez de "MY_TABLE" (veja a imagem abaixo)! Remover o espaço em branco resolveu o problema.
É um bug (e é possível enviá-lo aos desenvolvedores do ojdbc)?
Sim... O código procura por
INSERT
thenINTO
e então pula caracteres de espaço e assume que o próximo caractere sem espaço é o início do identificador para o nome da tabela. Quando ele encontra um caractere de nova linha, ele assume que é o início do identificador e retorna um único caractere de nova linha em vez do identificador real.O que ele deveria fazer é pular caracteres de espaço em branco em vez de apenas espaços. (Há mais problemas com esse método, incluindo: alterar a caixa do identificador ; procurar por um caractere de espaço ou
(
mas não outros caracteres de espaço em branco no final do identificador; e procurar porINSERT
thenINTO
em qualquer lugar da string em vez de apenas no início.)Entretanto... A solução alternativa é simples: não use caracteres de espaço em branco que não sejam espaços em
INSERT INTO my_table (
, apenas use espaços entre as palavras-chave e o identificador (e também não funcionará com identificadores com letras maiúsculas e minúsculas cercados por aspas, apenas use identificadores sem aspas).Então, sim, você pode denunciá-lo, mas, enquanto isso, você deve conseguir corrigir facilmente seu código para que ele não acione o problema.