6

以下のステートメントを使用して、データを更新/テーブルに挿入しています。パラメーターなしで実行した場合は、問題ありません。ただし、パラメータを使用して実行しようとすると、次のようにスローされます。

SQL0418N-ステートメントに、型指定されていないパラメーター・マーカー、DEFAULTキーワード、または無効なNULL値の使用が含まれています

ここでエラー情報を読みましたが、ステートメントが実行されない理由にまだ苦労しています。

--This statement works
MERGE Into AB.Testing_Table A
USING (VALUES('TEST', 'P')) B(TEST_ID, "ACTION")
ON (A.TEST_ID = B.TEST_ID)
WHEN NOT MATCHED THEN
INSERT (TEST_ID, "ACTION")
VALUES ('TEST', 'P')
WHEN MATCHED THEN
UPDATE SET TEST_ID = 'TEST'
,"ACTION" = 'P';

--This statement fails with error SQL0418N
MERGE Into AB.Testing_Table A
USING (VALUES(@TEST, @ACTION)) B(TEST_ID, "ACTION")
ON (A.TEST_ID = B.TEST_ID)
WHEN NOT MATCHED THEN
INSERT (TEST_ID, "ACTION")
VALUES (@TEST, @ACTION)
WHEN MATCHED THEN
UPDATE SET TEST_ID = @Test
,"ACTION" = @Action;

助けてくれてありがとう!

4

1 に答える 1

14

基本的に、DB2は、これらのパラメーターで送信しているデータ型を認識していません。古いバージョンのDB2(Linux / Unix / Windowsでは9.7未満、または10.1より古いメインフレームバージョン)を使用していると思いますが、これは「自動」型変換をあまり行いません。または、値を送信していNULLます(値は「入力」する必要があり、奇妙に聞こえます)。

パラメータマーカーを型付きパラメータとして作成することで問題を修正できます(ここではデータ型を想定しています。適切なものを使用してください)。

MERGE INTO AB.TESTING_TABLE A
USING (VALUES (
          CAST(@TEST AS CHAR(4))
         ,CAST(@ACTION AS CHAR(1))
       )) B(TEST_ID, "ACTION")
   ON (A.TEST_ID = B.TEST_ID)
 WHEN NOT MATCHED THEN
     INSERT (TEST_ID, "ACTION")
     VALUES (B.TEST_ID, B.ACTION)
WHEN MATCHED THEN
     UPDATE SET "ACTION" = B.ACTION

さらに、を使用しているので、またはパーツでMERGEパラメータを使用する必要はありません。渡したテーブルの値を参照できます。また、に一致しているため、次のことを行う必要はありません。とにかく更新されないので、ステートメントにそれを含めてください。UPDATEINSERTUSINGTEST_IDUPDATE

于 2012-11-14T15:48:49.870 に答える