此为历史版本和 IPFS 入口查阅区,回到作品页
谁想工作
IPFS 指纹 这是什么

作品指纹

项目过程--触发器和存储过程

谁想工作
·
世界是个巨大的草台班子(项目现仍在服役 --20240724)

在项目中,有一个标准功能,因为项目的定制开发导致某些状态无法自动回写。由于开发资源有限,也影响客户使用,当时开发资源紧张也迫在眉睫,基于这两点考虑我们录制的 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;


CC BY-NC-ND 4.0 授权