【发布时间】:2016-06-17 13:25:21
【问题描述】:
我有一个人们在上面下订单的系统,每个订单都有操作,并且存在一个名为 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 未填充信息。
提前致谢。
【问题讨论】:
-
为什么不使用更新前的?
-
如何执行更新?该过程是否会引发触发器传递的异常(未找到数据?),但这可能会被正在执行更新的任何事物压扁/忽略?您是否尝试过手动更新以查看发生了什么或进行任何调试?
-
我的猜测是您的触发器会引发错误。我的猜测是这是一个变异表错误。那是你实际看到的吗?您是否有一些代码正在吞噬这些错误?我希望您希望从您的过程中删除对
CM_ORD_ORDER_ACTION的引用——您需要从该表中传递您需要从触发器中获取的所有值。 -
@AlexPoole 正在通过脚本执行更新,一旦订单失败,该脚本会将 cm_ord_order_action 中的状态更新为“FA”。我没有收到任何错误,触发器只是未能将 cm_ord_order_action 状态更新为“FA”并且未能更新 cm_ord_failed_order。
-
@Iommiund - 该过程本身可能很好,但是当从触发器调用该过程时,它执行的查询将得到一个变异表错误,因为它引用了触发器所针对的表.如果您没有看到该错误,那么您的脚本中的某些内容正在捕获并忽略它,或者使用
when others处理程序,或者您的脚本可能正在丢弃输出。
标签: sql oracle triggers procedure