Faire une insertion DB2 avec un select et les paramètres

je veux faire quelque chose comme ceci:

INSERT INTO TABLEA
(
 COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, ?
FROM TABLEB

et ensuite envoyer ceci à JDBC via JDBC printemps pour mettre à jour...

simpleJdbcTemplate.update( mySqlFromAbove, someVariableToReplaceQuestionMark );

Est-ce même possible? Cela fonctionnerait très bien si je remplaçais le point d'interrogation par la valeur codée en dur lors de la construction de ma requête SQL, mais je ne veux pas m'ouvrir à L'injection SQL...

Edit -

J'obtiens

l'exception imbriquée est com.IBM.db2.ccm.C. SqlException: erreur DB2 SQL: SQLCODE: -418, SQLSTATE: 42610, SQLERRMC: null

Ce qui semble indiquer

utilisation non valide d'un marqueur de paramètre ?

10
demandé sur bwawok 2010-09-01 23:02:03

4 réponses

vous devez taper votre marqueur de paramètre pour que DB2 sache à quoi vous attendre.

Par exemple:

INSERT INTO TABLEA
(
 COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, cast(? as int)
FROM TABLEB

évidemment, cast vers le type approprié -- int n'est qu'un exemple.

12
répondu Ian Bjorhovde 2010-09-02 01:07:16

Voici le référence du Message SQL DB2. Voici un extrait de pertinence pour le SQLCODE et le SQLSTATE que vous avez récupéré:

SQL0418N

Un énoncé contient une utilisation d'un marqueur de paramètre qui n'est pas valide.

Explication:

les marqueurs de paramètres non typés ne peuvent pas être utilisés:

  • dans une liste SELECT
  • comme seul argument d'une opération arithmétique datetime
  • dans certains cas, comme le seul argument d'une fonction scalaire
  • comme clé de tri dans un ordre Par clause
  • dans une instruction qui n'est pas une déclaration préparée
  • dans le fullselect D'une instruction de vue CREATE
  • dans L'action déclenchée D'une instruction CREATE TRIGGER
  • dans une requête capturé par Requête DB2 Patrouilleur

La déclaration ne peut pas être traitée.

Réponse De L'Utilisateur:

Corriger la syntaxe de l'énoncé. Si des marqueurs de paramètres non typés ne sont pas autorisés, utilisez la spécification CAST pour donner un type de données au marqueur de paramètre.

sqlcode: -418

sqlstate: 42610

malheureusement cela ne répond pas à votre problème puisque votre SQL semble très bien. Après Google un peu plus d'apparence plutôt que le pilote DB2 JDBC ne mange tout simplement pas INSERT INTO ... SELECT ... instructions:PreparedStatement. Il n'est pas clair si cela manque dans la référence du Message SQL ou un bogue dans le pilote JDBC.

2
répondu BalusC 2010-09-01 23:36:25

ça devrait marcher. Et +1 pour l ' "injection sans SQL".

partagez et profitez.

1
répondu Bob Jarvis 2010-09-01 19:16:37

nous avons eu la même erreur, et nous avons corrigé le problème en recyclant le serveur. Dans le doute, reboot.

1
répondu Sean 2014-12-03 15:46:06