3

最終更新:

とにかく、私たちの場合、これはバグではないことがわかりました。関数呼び出しの奥深くに隠されているのは、関数が変化していることを示すエラー メッセージを難読化する例外ハンドラーでした。ハンドラーはそれを隠し、関数が本質的に有効な値を返すようにしました。今回は私たちの責任です。:)

元の投稿:

まず、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 として記録されていますが、ナレッジ ベースにはまだ表示されていません。

4

2 に答える 2

1

私のマネージャーは素晴らしいです!! 彼女は以下を追加することを提案しました:
pragmaautonomous_transaction;
関数本体の「is」の後に問題を解決します。
詳細については、 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/autotransaction_pragma.htm を参照してください。

元。
Function xyz (...)
  return varchar2
  is
   pragmaautonomous_transaction;
   何か varchar2(10);
   .
   .
   .
始めます

.
.
  何かを返します。
xyz を終了します。

于 2013-07-16T15:10:41.983 に答える
0

質問に対する答えがあります。関数内の例外ハンドラーが、関数が変化していることを知らせるエラー メッセージを難読化していました。これにより、関数と構文が有効であるかのように見えました。

于 2013-07-03T19:20:29.387 に答える