私は(この質問のために簡略化された)2つの列'id'(整数でdbではnullではない)と'value'(varcharでdbではnullではない)を持つテーブル'TAB'を持っています。私はJavaアプリケーションを使用して、一度に複数の行の「値」列を更新しています(これは私の要件です)。私はcaseとwhenキーワードでupdateステートメントを使用しました。クエリは、変更された行の数に応じて実行時に生成されます。
データがすべての行に対して一緒に更新される場合、クエリは正常に機能しますが、より少ない行に対して更新されるとエラーが発生します。id = 1、2、3の3つの行があり、値はそれぞれA、B、Cであるとします。
クエリが3つの行すべてに対して一緒に実行されると、正常に機能します
UPDATE
TAB set value = CASE
WHEN id = 1 THEN 'X' WHEN id = 2 THEN 'Y' WHEN id = 3 THEN 'Z'
END
しかし、クエリが3行未満で実行されると、DBエラーが発生します。
UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' END
次のエラーが発生します。
DBエラー=ORA-01407:("XXX"。"XXX"。"VALUE")をNULLに更新できません。
DBの「value」列がnullではないため、これが発生していることはわかっています。上記のクエリが残りのすべての値をNULLで更新しようとしているかどうかを知りたいですか?
以下に説明するようにELSEパーツを追加すると、クエリは正常に機能します。
UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' ELSE TAB.value END
DBに複数の行がある場合、上記のクエリはパフォーマンスの問題に影響しますか?