У меня есть система, на которую люди заказывают, каждый порядок имеет действия, а таблица существует как 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' из своей процедуры - вам нужно будет передать все значения из этой таблицы, которые вам нужны из триггера. –