最終更新:
とにかく、私たちの場合、これはバグではないことがわかりました。関数呼び出しの奥深くに隠されているのは、関数が変化していることを示すエラー メッセージを難読化する例外ハンドラーでした。ハンドラーはそれを隠し、関数が本質的に有効な値を返すようにしました。今回は私たちの責任です。:)
元の投稿:
まず、PL/SQL ブロックでこの問題を回避したので、これは本当に好奇心です。しかし、私も同僚も、この更新プログラムが機能しないことを理解できません。誰にもアイデアはありますか?
新しい列を適切な値で更新しようとしています。以前は、レコードのステータスはオンデマンドでステータスを計算する関数を使用して決定されていましたが、専用のテーブルを使用するように変換しただけで、ステータスを保存できるようになり、将来の柔軟性が向上しました。
以下の select はうまく機能します - 14 レコードを取得します:
select *
from QUERY_TABLE QT1
where QT1.P_ID in
(select QT2.P_ID opi
from QUERY_TABLE QT2
where F_GET_STATUS(QT2.FUNC_VAL_1,
(select RT.FUNC_VAL_2 from RELATED_TABLE RT where RT.RELKEY = QT2.RELKEY)) = 'Value');
ただし、以下の更新では、同じ WHERE 句を使用して、0 レコードを更新します。
update QUERY_TABLE QT1
set QT1.STAT_ID = 1
where QT1.P_ID in
(select QT2.P_ID opi
from QUERY_TABLE QT2
where F_GET_STATUS(QT2.FUNC_VAL_1,
(select RT.FUNC_VAL_2 from RELATED_TABLE RT where RT.RELKEY = QT2.RELKEY)) = 'Value');
それが役立つかどうかはわかりませんが、以下の PL/SQL ブロックは更新を処理するためにうまく機能します。
begin
for x in (
select QT2.P_ID opi
from QUERY_TABLE QT2
where F_GET_STATUS(QT2.FUNC_VAL_1,
(select RT.FUNC_VAL_2 from RELATED_TABLE RT where RT.RELKEY = QT2.RELKEY)) = 'Value')
loop
update QUERY_TABLE QT1
set QT1.STAT_ID = 1
where P_ID = x.opi;
end loop;
end;
/
スキーマ所有者と適切な権限を持つ別のユーザーを使用して更新を実行しました。テーブルには、更新を無効にするトリガーはありません。関数は何も変なことをせず、関数と update はお互いを食べません (これはまったく新しい列です - 関数は列の値から構文的に独立しています)。エラー メッセージは表示されません。0 列を更新するだけです。
更新 1 同じ問題を抱えている可能性がある人のために、Oracle に連絡しましたが、これは新しいバグであることが判明しました。Bug 17015253 : UPDATE STATEMENT WITH FUNCTION IN SUBQUERY DOES NOT UPDATE ROWS として記録されていますが、ナレッジ ベースにはまだ表示されていません。