Faça uma inserção do DB2 com um seleto e parâmetros
-
26-09-2019 - |
Pergunta
Eu quero fazer algo assim:
INSERT INTO TABLEA
(
COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, ?
FROM TABLEB
E depois envie isso para JDBC via Spring JDBC para atualizar ...
simpleJdbcTemplate.update( mySqlFromAbove, someVariableToReplaceQuestionMark );
Isso é possível? Funcionaria bem se eu substituísse o ponto de interrogação pelo valor codificado ao criar minha consulta SQL, mas não quero me abrir para a injeção de SQL ...
Editar -
eu recebo
A exceção aninhada é com.ibm.db2.jcc.c.sqlexception: db2 sql error: sqlcode: -418, sqlstate: 42610, sqlerrmc: null
O que parece indicar
Uso inválido de um marcador de parâmetro?
Solução
Você precisa digitar seu marcador de parâmetros para que o DB2 saiba o que esperar.
Por exemplo:
INSERT INTO TABLEA
(
COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, cast(? as int)
FROM TABLEB
Obviamente, fundido para o tipo apropriado - int é apenas um exemplo.
Outras dicas
Aqui está o Referência de mensagem SQL DB2. Aqui está um extrato de relevância para o SQLCode e o SQLSTATE que você recuperou:
SQL0418N
Uma instrução contém o uso de um marcador de parâmetro que não é válido.
Explicação:
Marcadores de parâmetros não titados não podem ser usados:
- em uma lista de seleção
- Como o único argumento de uma operação aritmética de DateTime
- em alguns casos como o único argumento de uma função escalar
- como uma chave de classificação em uma cláusula de ordem por
Os marcadores de parâmetros nunca podem ser usados:
- em uma declaração que não é uma declaração preparada
- No FullSelect de uma instrução CREATE VIEW
- Na ação desencadeada de uma declaração de gatilho de criação
- Em uma consulta capturada pelo DB2 Query Patroller
A declaração não pode ser processada.
Resposta do usuário:
Corrija a sintaxe da declaração. Se os marcadores de parâmetros não forem permitidos, use a especificação de elenco para fornecer ao marcador um tipo de dados ao parâmetro.
SQLCODE: -418
SQLSTATE: 42610
Infelizmente, isso não responde ao seu problema, pois seu SQL parece parecer bom. Depois Pesquisando no Google Um pouco mais parece mais que o driver DB2 JDBC simplesmente não come INSERT INTO ... SELECT ...
declarações em a PreparedStatement
. Não está claro se isso está faltando na referência da mensagem SQL ou em um bug no driver JDBC.