项目过程--触发器和存储过程
在项目中,有一个标准功能,因为项目的定制开发导致某些状态无法自动回写。由于开发资源有限,也影响客户使用,当时开发资源紧张也迫在眉睫,基于这两点考虑我们录制的 SPR 日志看结算后数据库的更新过程,使用触发器和存储过程去自动触发这个过程。
标准产品背景:
共享中心结算岗接收到各子公司的付款申请,共享结算岗需要在erp系统内将这个付款申请单据传递到司库进行支付,在共享结算岗接单的模式下,付款申请传递到司库后会对当前作业员的作业任务进行减少,待司库支付成功后更新erp的支付状态;但项目中推送司库这个动作是客开导致的,推送后共享结算岗的工作界面并不能更新,导致共享结算岗不知道直观看到哪个付款结算推送过,哪个付款结算没有推送成功...
解决方案:
--触发器
CREATE OR REPLACE TRIGGER ssctp_currenttask_trigger
AFTER UPDATE OF paystatus ON sp_dirpayment
FOR EACH ROW
BEGIN
IF :NEW.paystatus IS NOT NULL AND
( :OLD.paystatus IS NULL OR :NEW.paystatus != :OLD.paystatus ) THEN -- 如果 paystatus 非空且发生变化
MyProcedure(:NEW.vbillno, :NEW.paystatus);
END IF;
END;
--创建存储过程
CREATE OR REPLACE PROCEDURE MyProcedure(
vbillno IN VARCHAR2,
paystatus IN VARCHAR2
) IS
BEGIN
IF paystatus IS NULL THEN -- 如果 paystatus 为 NULL,直接返回
RETURN;
END IF;
IF paystatus = '3' THEN -- 假设 3 代表支付中
UPDATE ssctp_currenttask
SET taskstatus='sscapprove'
WHERE NVL(dr, 0) = 0 AND billno = vbillno;
UPDATE ssctp_task
SET taskstatus='sscapprove'
WHERE NVL(dr, 0) = 0 AND billno = vbillno;
UPDATE SSCTP_TASKEXTENDINFO EXTENDINFOS
SET EXTENDINFOS.def9 = '3'
WHERE NVL(dr, 0) = 0 AND EXTENDINFOS.PK_CURRENTTASK IN
(SELECT pk_currenttask FROM ssctp_currenttask WHERE billno = vbillno);
ELSIF paystatus = '1' THEN -- 支付成功
UPDATE SSCTP_TASKEXTENDINFO EXTENDINFOS
SET EXTENDINFOS.def9 = '1'
WHERE NVL(dr, 0) = 0 AND EXTENDINFOS.PK_CURRENTTASK IN
(SELECT pk_currenttask FROM ssctp_currenttask WHERE billno = vbillno);
ELSIF paystatus = '2' THEN -- 支付失败
UPDATE SSCTP_TASKEXTENDINFO EXTENDINFOS
SET EXTENDINFOS.def9 = '2'
WHERE NVL(dr, 0) = 0 AND EXTENDINFOS.PK_CURRENTTASK IN
(SELECT pk_currenttask FROM ssctp_currenttask WHERE billno = vbillno);
END IF;
-- COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLCODE || ' - ' || SQLERRM);
-- ROLLBACK;
END MyProcedure;