刚刚写的ORACLE存储过程

此过程描述了一个用于处理会员点数减少及相应职务变化的数据库存储过程。当发生退单、锁定或冻结等情况时,该过程会递归地更新会员及其上级的点数,并依据A区和B区的主任及经理数量来调整职务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE OR REPLACE PROCEDURE P_SubtractPoint
(
uMsg OUT VARCHAR2
)

-- 在冻结、锁定、退单等要求减点数的操作中执行减点工作
-- SW_HYCJ 会员处理表,记录退单、锁定、冻结的会员记录

AS
-- 定义游标,将未处理的记录检索出来
CURSOR C_HYCL IS SELECT XH,UPPER(HYBH) HYBH,CLSJ,DS,HYZT FROM SW_HYCL WHERE CLID = 0;

uXH NUMBER;uHYBH VARCHAR2(20);uCLSJ DATE;uDS NUMBER;uHYZT VARCHAR2(20);uFJDBH VARCHAR2(20);uFJDQY VARCHAR2(20);
uMAX_CS NUMBER;uCS NUMBER;uExist NUMBER;uAZD NUMBER;uBZD NUMBER;
uLPC NUMBER; uINC NUMBER;uAPQ NUMBER;uAPH NUMBER;uBPQ NUMBER;uBPH NUMBER;
uCOUNTA NUMBER;uCOUNTB NUMBER;

-- 进入事务处理流程
BEGIN

  -- 进入游标处理流程
  FOR CC_HYCL IN C_HYCL LOOP
    uXH   := CC_HYCL.XH;
    uHYBH := CC_HYCL.HYBH;
    uCLSJ := CC_HYCL.CLSJ;
    uDS   := CC_HYCL.DS;
    uHYZT := CC_HYCL.HYZT;

    -- 获得标志,是否存在该会员编号的父节点记录
    SELECT COUNT(*) INTO uExist FROM SW_FZB WHERE UPPER(HYBH) = uHYBH;

    -- 判断是否存在父节点记录
    IF (uExist > 0 ) THEN  -- 如果存在

      -- 获得该会员所属团队的量碰层
      SELECT LPC INTO uLPC FROM SW_CSB WHERE fGroup = F_GetGroup(uHYBH) AND uCLSJ >= KSSJ AND uCLSJ <= JSSJ;

      -- 获得最小层数和最大层数,准备循环处理每一层的父节点
      SELECT MIN(FJDCS),MAX(FJDCS) INTO uCS,uMAX_CS FROM SW_FZB WHERE UPPER(HYBH) = uHYBH;

      -- 按层数循环开始处理每个父节点
      WHILE uCS <= uMAX_CS LOOP

        -- 获得指定层的父节点的编号、区域
        SELECT UPPER(FJDBH),FJDQY INTO uFJDBH,uFJDQY FROM SW_FZB WHERE UPPER(HYBH) = uHYBH AND FJDCS = uCS;

        -- 获得A、B区的余额点数和A、B区的总点数
        SELECT AQYEDS,BQYEDS,AQLJDS,BQLJDS INTO uAPQ,uBPQ,uAZD,uBZD FROM SW_HYB WHERE UPPER(HYBH) = uFJDBH;

        uINC := uDS;  --考虑大于量碰层后再增加点数
        IF (uCS + uLPC - 1) > uMAX_CS THEN
          uINC := 0;
        END IF;

        -- 判断父节点的区域
        IF (uFJDQY = 'A区') THEN
          uAPH := uAPQ - uINC;
          uAZD := uAZD - uDS;
          UPDATE SW_HYB SET
            AQLJRS = AQLJRS - 1,
            AQLJDS = AQLJDS - uDS,
            AQYEDS = AQYEDS - uINC
          WHERE UPPER(HYBH) = uFJDBH;
        ELSE
          uBPH := uBPQ - uINC;
          uBZD := uBZD - uDS;
          UPDATE SW_HYB SET
            BQLJRS = BQLJRS - 1,
            BQLJDS = BQLJDS - uDS,
            BQYEDS = BQYEDS - uINC
          WHERE UPPER(HYBH) = uFJDBH;
        END IF;

        -- 开始处理职务问题
        -- 先处理主任级别的职务
        IF (uAZD < 400 OR uBZD < 400) THEN
          SELECT COUNT(*) INTO uExist FROM SW_ZWB WHERE UPPER(HYBH) = uFJDBH AND ZWMC='主任';
          IF uExist > 0 THEN
            DELETE FROM SW_ZWB WHERE UPPER(HYBH) = uFJDBH AND ZWMC='主任';
            UPDATE SW_ZWB SET ZWMC = '' WHERE UPPER(HYBH) = uFJDBH;
          END IF;
        END IF;

        -- 处理经理级别的职务
        -- 计算A、B区的主任人数
        SELECT COUNT(*) INTO uCOUNTA FROM SW_FZB WHERE UPPER(FJDBH) = uFJDBH AND FJDQY ='A区' AND HYBH IN (SELECT HYBH FROM SW_ZWB WHERE ZWMC = '主任');
        SELECT COUNT(*) INTO uCOUNTB FROM SW_FZB WHERE UPPER(FJDBH) = uFJDBH AND FJDQY ='B区' AND HYBH IN (SELECT HYBH FROM SW_ZWB WHERE ZWMC = '主任');

        IF (uCOUNTA = 0 OR uCOUNTB = 0) THEN
          SELECT COUNT(*) INTO uExist FROM SW_ZWB WHERE UPPER(HYBH) = uFJDBH AND ZWMC = '经理';
          IF uExist > 0 THEN
            DELETE FROM SW_ZWB WHERE UPPER(HYBH) = uFJDBH AND ZWMC='经理';
            UPDATE SW_ZWB SET ZWMC = '主任' WHERE UPPER(HYBH) = uFJDBH;
          END IF;
        END IF;

        -- 处理总监级别的职务
        -- 计算A、B区的经理人数
        SELECT COUNT(*) INTO uCOUNTA FROM SW_FZB WHERE UPPER(FJDBH) = uFJDBH AND FJDQY ='A区' AND HYBH IN (SELECT HYBH FROM SW_ZWB WHERE ZWMC = '经理');
        SELECT COUNT(*) INTO uCOUNTB FROM SW_FZB WHERE UPPER(FJDBH) = uFJDBH AND FJDQY ='B区' AND HYBH IN (SELECT HYBH FROM SW_ZWB WHERE ZWMC = '经理');

        IF (uCOUNTA = 0 OR uCOUNTB = 0) THEN
          SELECT COUNT(*) INTO uExist FROM SW_ZWB WHERE UPPER(HYBH) = uFJDBH AND ZWMC = '总监';
          IF uExist > 0 THEN
            DELETE FROM SW_ZWB WHERE UPPER(HYBH) = uFJDBH AND ZWMC='总监';
            UPDATE SW_ZWB SET ZWMC = '经理' WHERE UPPER(HYBH) = uFJDBH;
          END IF;
        END IF;

        -- 修改 SW_Change ,加入相关变动数据
        DELETE FROM SW_Change WHERE F_Source = uHYBH AND F_Father = uFJDBH AND F_RQ = uCLSJ AND F_BZ = uHYZT;

        INSERT INTO SW_Change (F_XH,F_RQ,F_Source,F_Father,F_Point,F_AQ,F_BQ,F_AH,F_BH,F_JE,F_AREA,F_BZ,F_DESC)
        VALUES (CHANGE_XH.NEXTVAL,uCLSJ,uHYBH,uFJDBH,uDS,uAPQ,uBPQ,uAPH,uBPH,0,uFJDQY,uHYZT,uHYZT||'减点处理');

        -- 层数加1,继续循环处理下一个父节点
        uCS := uCS + 1;
      END LOOP;
    END IF;

    -- 设置该记录为已处理
    UPDATE SW_HYCL SET CLID = 1 WHERE XH = uXH;
  END LOOP;

  COMMIT;
  uMsg := '会员处理事务成功!';
EXCEPTION
  WHEN Others THEN
    ROLLBACK;
    uMsg := '会员处理事务失败!';
END P_SubtractPoint;

-- 手工添加错误信息
-- RAISE_APPLICATION_ERROR(-20010, 'ERROR:违反唯一索引约束!');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彖爻之辞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值