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 ?
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.
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.
ça devrait marcher. Et +1 pour l ' "injection sans SQL".
partagez et profitez.
nous avons eu la même erreur, et nous avons corrigé le problème en recyclant le serveur. Dans le doute, reboot.