人が注文し、各注文にアクションがあり、テーブルがcm_ord_order_actionというシステムを持っています。アクションが失敗することがあるので、失敗した注文アクションの情報を取得し、cm_ord_failed_orderというテーブルを作成するトリガーを作成する必要があります。トリガーと手続きによってテーブルが更新されない
トリガを以下に示します。
CREATE OR REPLACE TRIGGER CM.TRGID_CM_ORD_FAILED_ORDER
AFTER UPDATE ON CM.CM_ORD_ORDER_ACTION
FOR EACH ROW
BEGIN
IF (:new.STATUS = 'FA') THEN
CM.CM_FAILED_ORDER_MLT(:new.order_unit_id, :new.order_id, :new.action_type);
END IF;
END;
/
このトリガがテーブルを更新するプロシージャにパラメータを渡します。
CREATE OR REPLACE PROCEDURE CM_FAILED_ORDER_MLT(
v_order_unit_id NUMBER,
v_order_id in NUMBER,
v_action_type in VARCHAR)
AS
v_lob varchar(100);
v_step varchar(100);
v_error varchar(200);
BEGIN
SELECT
ITEM.LOB_NAME, ST.STEP_NAME, ASS.STEP_ERROR
INTO v_lob, v_step, v_error
FROM
CM.CM_ORD_ORDER_ACTION OA
INNER JOIN CM.CM_ORD_ASSIGNMENTS ASS
ON OA.ORDER_UNIT_ID = ASS.ORDER_ACTION_ID
INNER JOIN CM.CM_ORD_PROCESS_STEP ST
ON ST.ORD_PROCESS_STEP_ID = ASS.STEP_ID
INNER JOIN CM.CM_ORD_AP_ITEM ITEM
ON ITEM.AP_SUBSCRIBER_ID = OA.AP_SUBSCRIBER_ID
WHERE ASS.COMPLETION_STATUS = 'FA'
AND OA.ORDER_ID = v_order_id
AND OA.ORDER_UNIT_ID = v_order_unit_id
GROUP BY OA.ORDER_UNIT_ID, ITEM.LOB_NAME, ST.STEP_NAME, ASS.STEP_ERROR;
INSERT INTO CM_ORD_FAILED_ORDER (ORDER_ID, FAILED_DATE, ORDER_ACTION_ID, ACTION_TYPE, LOB, STEP, ERROR)
VALUES (v_order_id, sysdate, v_order_unit_id, v_action_type, v_lob, v_step, v_error);
END CM_FAILED_ORDER_MLT;
/
間違って何かがここにおそらくありますので: A - にもかかわらずトリガはcm_ord_order_actionの更新後のものです。トリガが有効な場合、ステータスは更新されませんが、トリガを無効にすると状態が更新されます。
B - cm_ord_failed_orderテーブルに情報が入力されていません。
ありがとうございます。
なぜ更新前に使用しないのですか? – kevinsky
更新はどのように実行されますか?プロシージャは例外をスローしていますか(データが見つかりません?)、トリガーが通過しますが、更新を実行しているものが何かをしゃべって/無視していますか?何が起こるかを確認するために手動でアップデートをやってみましたか、デバッグしましたか? –
私の推測では、あなたのトリガーはエラーを投げます。私の推測では、それは突然のテーブルエラーです。それはあなたが実際に見ているものですか?これらのエラーを飲み込んでいるコードがありますか?プロシージャから 'CM_ORD_ORDER_ACTION'への参照を削除したいと思うでしょう - あなたはトリガから必要なテーブルからすべての値を渡す必要があります。 –