[解決済み] Oracle Form FRM-40735: ON-ERROR trigger raised unhandled exception ORA-06502
質問
以下のようなテーブルトリガーがあります。
CREATE OR REPLACE TRIGGER PAT_BUR_DOB_TRG
BEFORE UPDATE OF DOB
ON PAT
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
-- PL/SQL Block
begin
tgln_sys_error_pkg.compare_dates(trunc(add_months(:new.dob, -12)),
trunc(tgln_sys_error_pkg.GET_LIST_DATE(:old.pat_id)),
tgln_sys_errnums_pkg.en_retr_waitlist_date);
end;
--------------------------------------
私は、上記のトリガーによって呼び出されるパッケージを持っており、そのパッケージのコードは以下の通りです。
CREATE OR REPLACE PACKAGE TGLN_SYS_ERROR_PKG AS
/* To compare two dates against each other. */
PROCEDURE COMPARE_DATES
(P_DATE_LOW date
,P_DATE_HIGH date
,P_ERROR_CODE number
);
FUNCTION GET_LIST_DATE
(P_PAT_ID number)
RETURN DATE;
END TGLN_SYS_ERROR_PKG;
--------------------------------------
パッケージ本体は以下のようなものです。
CREATE OR REPLACE PACKAGE BODY TGLN_SYS_ERROR_PKG AS
FUNCTION GET_LIST_DATE(P_PAT_ID number) RETURN DATE IS
v_ret_date date;
begin
--select to_date('01-JAN-1980') into p_Date from dual;
select max(pwl.eff_date)
into v_ret_date
from pat, pat_register pr, pat_register_org_det prod, pat_wait_list pwl
where pat.pat_id = pr.pat_id
and pr.patr_id = prod.patr_id
and prod.prod_id = pwl.prod_id
and pat.pat_id = P_PAT_ID
and rownum < 2
AND pwl.exp_date is null;
return nvl(v_ret_date, to_date(null));
exception
when no_data_found then
return to_date(null);
end GET_LIST_DATE;
PROCEDURE COMPARE_DATES
(P_DATE_LOW date
,P_DATE_HIGH date
,P_ERROR_CODE number
)
IS
begin
if nvl(p_date_low,sysdate-10000)>nvl(p_date_high,sysdate+10000) then
raise_application_error(p_error_code,null);
end if;
end compare_dates;
end TGLN_SYS_ERROR_PKG;
--------------------------------------
CREATE OR REPLACE PACKAGE TGLN_SYS_ERRNUMS_PKG IS
en_retr_waitlist_date CONSTANT INTEGER := -20088; --Patient waitlist effective dates must not be less than or equal to patient's date of birth minus one year ( DOB - 1 year).
END TGLN_SYS_ERRNUMS_PKG;
--------------------------------------
Oracle FormsでDOBデータを更新すると、毎回以下のようなエラーが発生します。
<ブロッククオートOracle Form FRM-40735: ON-ERROR trigger raised unhandled exception ORA-06502
しかし、以下のようなハードコードでは
select to_date('01-JAN-1980') into p_Date from dual;
の代わりに、この段落のコードを以下のように変更すると、フォームが正常に動作するようになります。
select max(pwl.eff_date)
into v_ret_date
from pat, pat_register pr, pat_register_org_det prod, pat_wait_list pwl
where pat.pat_id = pr.pat_id
and pr.patr_id = prod.patr_id
and prod.prod_id = pwl.prod_id
and pat.pat_id = P_PAT_ID
and rownum < 2
AND pwl.exp_date is null;
置き換えました
p_pat_id
を実際の値に置き換えると、トリガーエラーがポップアップします。
ORA-04091: table TGLN.PAT is mutating, trigger/function may not see it
ORA-06512: at "TGLN.TGLN_SYS_ERROR_PKG",
line 130 ORA-06512: at "TGLN.PAT_BUR_DOB_TRG",
line 26 ORA-04088: error during execution of trigger 'TGLN.PAT_BUR_DOB_TRG'
View program sources of error stack?"
では、このバグを修正するにはどうすればよいのでしょうか。日付の値をハードコードすることができない
解決方法は?
エラーが発生しました。
ORA-04091:テーブル名が変異しているため、トリガー/関数がそれを見ない可能性があります/。
あなたのエラー
trigger error:"ORA-04091: table TGLN.PAT is mutating
原因
あるステートメントがトリガーまたはカスタムPL/SQL関数を実行しました。そのトリガ/関数は、トリガ/関数を起動したステートメントによって現在変更されているテーブルを変更またはクエリしようとしました。
原因
--you're not supposed to query a table that is currently modified
--In you're case its `PAT` table being updated and querying at same time
select max(pwl.eff_date)
into v_ret_date
from pat, --here you are querying your PAT table,while updating the same table
pat_register pr, pat_register_org_det prod, pat_wait_list pwl
where pat.pat_id = pr.pat_id
and pr.patr_id = prod.patr_id
and prod.prod_id = pwl.prod_id
and pat.pat_id = P_PAT_ID
and rownum < 2
AND pwl.exp_date is null;
アクション
このOracleエラーを解決するための選択肢は、以下の通りです。
トリガー/関数を書き換えて、そのトリガー/関数が次のことを試みないようにします。
modify/query
テーブル
PAT
を質問します。
参考
関連
-
オラクルのブロック修正追跡機能の説明
-
オラクルのTO_DATEの使い方解説
-
Oracle ADGプロセスを構築するDBCAコマンドライン
-
Oracleトレースファイルの詳細な使用方法
-
[解決済み】Oracle "SQL Error: Missing IN or OUT parameter at index:: 1" と表示されました。
-
[解決済み] ORA-01461: LONG 値は、LONG 列への挿入にのみバインドできます-クエリー時に発生します。
-
[解決済み] ORA-01109: データベースが開きません」エラーを解決するにはどうすればよいですか?
-
[解決済み] PLS-00302: component must be declared when it exists?」と表示されます。
-
[解決済み] PLS-00306:Oracle SP の呼び出しで引数の数または種類が誤っている。
-
[解決済み] このPL/SQLは何が問題なのでしょうか?バインド変数 * が DECLARED ではありません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IntelliJ DataGrip Oracle 11gリモート接続の手順
-
オラクル、新プロジェクトの実践のためのテーブルを作成
-
Oracle Databaseの失敗したオブジェクトの処理の詳細
-
オラクルインデックス概要
-
オラクル・ラックのケーススタディ
-
[解決済み] エラーを取得する - ORA-01858: 数値が期待される場所で非数値文字が見つかりました。
-
[解決済み] ORA-01461: LONG 値は、LONG 列への挿入にのみバインドできます-クエリー時に発生します。
-
[解決済み] PLS-00103:次のいずれかを期待しているときに、記号"; "に遭遇しました。
-
[解決済み] oracleの'enq:TM contention'待ちイベントが発生する原因
-
[解決済み] カラムが存在するにもかかわらず、ORA-00904が発生するのはなぜですか?