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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top