10

私はこのようなことをしたい:

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

次に、これをSpring JDBC経由でJDBCに送信して、更新します...

simpleJdbcTemplate.update( mySqlFromAbove, someVariableToReplaceQuestionMark );

これも可能ですか?SQLクエリを作成するときに疑問符をハードコードされた値に置き換えれば問題なく動作しますが、SQLインジェクションを受け入れたくありません...

編集-
ネストされた例外はcom.ibm.db2.jcc.c.SqlException です
:DB2 SQLエラー:SQLCODE:-418、SQLSTATE:42610、SQLERRMC:nullこれ はパラメーターマーカーの使用が無効であること
を示しているようです。

4

2 に答える 2

12

DB2が何を期待するかを認識できるように、パラメーター・マーカーを型キャストする必要があります。

例えば:

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

明らかに、適切な型にキャストします--intは単なる例です。

于 2010-09-02T01:07:16.313 に答える
2

これがDB2SQLメッセージ・リファレンスです。取得したSQLCODEとSQLSTATEの関連性の抜粋を次に示します。

SQL0418N

ステートメントに、無効なパラメーター・マーカーの使用が含まれています。

説明:

型指定されていないパラメーターマーカーは使用できません。

  • SELECTリスト内
  • 日時算術演算の唯一の引数として
  • 場合によっては、スカラー関数の唯一の引数として
  • ORDERBY句のソートキーとして

パラメータマーカーは使用できません。

  • プリペアドステートメントではないステートメント内
  • CREATEVIEWステートメントの全選択で
  • CREATETRIGGERステートメントのトリガーされたアクションで
  • DB2QueryPatrollerによってキャプチャーされた照会内

ステートメントを処理できません。

ユーザーの処置:

ステートメントの構文を修正してください。型指定されていないパラメーター・マーカーが許可されていない場合は、CAST仕様を使用して、パラメーター・マーカーにデータ型を指定してください。

sqlcode:-418

sqlstate:42610

残念ながら、SQLは正常に見えるため、これでは問題は解決しません。もう少しグーグルすると、 DB2JDBCドライバーは単に。INSERT INTO ... SELECT ...のステートメントを食べないように見えますPreparedStatement。それがSQLメッセージリファレンスにないのか、JDBCドライバーのバグなのかは不明です。

于 2010-09-01T23:36:25.050 に答える