3. 冻结表插入操作存储过程
CREATE OR REPLACE PROCEDURE PAYT.SP_FROZEN_FOR_INSERTING (
   P_MONEY         IN FLOAT,                                        --冻结金额
   P_VALID         IN NUMBER,                        --是否冻结::1.冻结,0.解冻
   P_MEMBER_ID     IN NUMBER,                                         --会员ID
   P_MERCHANT_ID   IN NUMBER                                          --商户ID
)
IS
   V_MONEY         FLOAT (126);                                     --冻结金额
   V_VALID         NUMBER (1);                       --是否冻结::1.冻结,0.解冻
   V_MEMBER_ID     NUMBER (19);                                       --会员ID
   V_MERCHANT_ID   NUMBER (19);                                       --商户ID
   V_USEBALANCE    FLOAT (126);                           --商戶或會員可用余額
   V_EXIST         NUMBER (19);                           --商戶或會員是否存在
BEGIN
   V_MONEY := P_MONEY;                                              --冻结金额
   V_VALID := P_VALID;                               --是否冻结::1.冻结,0.解冻
   V_MEMBER_ID := P_MEMBER_ID;                                        --会员ID
   V_MERCHANT_ID := P_MERCHANT_ID;                                    --商户ID
   V_USEBALANCE := 0;                                     --商戶或會員可用余額
-----------------------------------------------------------------------------------
   --       CATEGORY                         ID             DNAME            FROZEN --
   --       TradeSettlementCategory         506            转帐支出          YES    --
   --       TradeSettlementCategory         505            退款支出          YES    --
   --       TradeSettlementCategory         507            提现支出          YES    --
   --       TradeSettlementCategory         508            手续费支出        NO     --
   --       TradeSettlementCategory         509            返点收入          NO     --
   --       TradeSettlementCategory         504            支付收入          NO     --
   -----------------------------------------------------------------------------------

   CASE
      WHEN V_MEMBER_ID IS NULL
      --商户处理:转帐支出,退款支出,提现支出
      /*    由于上述三种支出需长时间处理且状态不确定,为保证资金安全,需先冻结*/
      THEN
         SELECT   COUNT (MERCHANT_ID)
           INTO   V_EXIST
           FROM   TAB_MERCHANTFUND
          WHERE   MERCHANT_ID = V_MERCHANT_ID;
IF V_EXIST > 0
         --存在并冻结
         /*    余额=总收入-总支出=可用余额+冻结金额  */
         /*    余额不变,可用余额减少,冻结金额增加  */
         THEN
                SELECT   usebalance
                  INTO   v_usebalance
                  FROM   TAB_MERCHANTFUND
                 WHERE   MERCHANT_ID = V_MERCHANT_ID
            FOR UPDATE   ;
IF V_USEBALANCE >= V_MONEY
            --余额大于冻结金额
            THEN
               UPDATE   tab_merchantfund
                  SET   frozenprice = frozenprice + v_money,
                        usebalance = usebalance - v_money
                WHERE   merchant_id = v_merchant_id;
            ELSE
               --可用余额,不足以支付该笔交易则报错
               raise_application_error (
                  -20001,
                  'Balance is insufficient, please phone!'
               );
            END IF;
         ELSE
            --不存在则不能冻结并报错
            raise_application_error (
               -20001,
               'Balance is insufficient, please phone!'
            );
         END IF;
      WHEN V_MERCHANT_ID IS NULL
      --会员处理:转帐支出,退款支出,提现支出
      /*    由于上述三种支出需长时间处理且状态不确定,为保证资金安全,需先冻结*/
      THEN
         SELECT   COUNT (MEMBER_ID)
           INTO   V_EXIST
           FROM   TAB_MEMBERFUND
          WHERE   MEMBER_ID = V_MEMBER_ID;
IF V_EXIST > 0
         --存在并冻结
         /*    余额=总收入-总支出=可用余额+冻结金额  */
         /*    余额不变,可用余额减少,冻结金额增加  */
         THEN
                SELECT   usebalance
                  INTO   v_usebalance
                  FROM   TAB_MEMBERFUND
                 WHERE   MEMBER_ID = V_MEMBER_ID
            FOR UPDATE   ;
IF V_USEBALANCE >= V_MONEY
            --余额大于冻结金额
            THEN
               UPDATE   TAB_MEMBERFUND
                  SET   frozenprice = frozenprice + v_money,
                        usebalance = usebalance - v_money
                WHERE   member_id = v_member_id;
            ELSE
               --可用余额,不足以支付该笔交易则报错
               raise_application_error (
                  -20001,
                  'Balance is insufficient, please phone!'
               );
            END IF;
         ELSE
            --不存在则不能冻结并报错
            raise_application_error (
               -20001,
               'Balance is insufficient, please phone!'
            );
         END IF;
   END CASE;
END;
/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25198367/viewspace-745870/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25198367/viewspace-745870/

资金表实现过程方案二:资金表与冻结表分离(三)相关推荐

  1. 资金表实现过程方案二:资金表与冻结表分离(一)

    1. 分别在资金表与冻结表建立两个触发器 CREATE OR REPLACE TRIGGER TRG_TAB_TRADESETTLEMENT_HIS29    BEFORE INSERT OR DEL ...

  2. 资金表实现过程方案一:资金表与冻结表合并(一)

    1. 触发器调用存储过程 a. 向资金表插入数据前查询出当前交易前余额 b. 分别调用三个存储过程实现该表的insert/update/delete 三种操作的触发 CREATE OR REPLACE ...

  3. (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二

    http://blog.csdn.net/yerenyuan_pku/article/details/52894958 前面我们已经集成了Spring4.2.5+Hibernate4.3.11+Str ...

  4. 实验:跨域VPN-OptionC方式-方案二

    配置思路         基础配置:各接口IP地址.环回口IP地址 IGP配置:各AS内环回口IP地址互通 MPLS配置:PE和ASBR之间配置MPLS LDP,建立LSP隧道 BGP基础配置:PE和 ...

  5. 图表CanvasChartView(四):基于方案二的优化

    前言 之前我们已经讨论并实现了两种实现滑动的方案,最终第二种实现了我们想要的效果,今天我们对方案二优化一下,让我们的CanvasChartView体验起来更屌. 都有哪些地方需要优化呢: Fling效 ...

  6. Moveit+Gazebo:搭建双臂仿真平台(方案二)

    演示视频:Moveit+Gazebo:搭建双臂仿真平台(方案二)_哔哩哔哩_bilibili 实现效果如上图所示,有两个rviz界面分别展示两条臂的运动,gazebo中同步rviz中的运动. 先说一下 ...

  7. 如何完美隐藏Disposable的存储和销毁过程(二)

    如何完美隐藏Disposable的存储和销毁过程(二) 前面一节大致讲了讲,我们的成品到底是怎么样的?那么这一节,我们就来讲讲如何初步地隐藏自己Disposable的存储和销毁. 首先说说最常见的方式 ...

  8. SQL Server 数据库的整理优化的基本过程(二)

    SQL Server 数据库的整理优化的基本过程(二) 高建刚 第一节 基本维护 第二节 索引 索引相信大家都不陌生,而且在因特网上,有了很多关于如何通过索引来优化数据库的文章,在这里,我主要是结合我 ...

  9. springboot集成mybatis源码分析-启动加载mybatis过程(二)

    springboot集成mybatis源码分析-启动加载mybatis过程(二) 1.springboot项目最核心的就是自动加载配置,该功能则依赖的是一个注解@SpringBootApplicati ...

最新文章

  1. strlen函数_7.2 C++字符串处理函数
  2. 如果用户希望将一台计算机,计算机网络试卷(有答案版)
  3. 04.卷积神经网络 W1.卷积神经网络
  4. 3行python代码实现假聊天机器人(慎入:这是假机器人!!!)
  5. 中文字符集编码unicode,gb2312,cp936,GBK,GB18030介绍
  6. 乐理基础-曲谱、简谱、音名、唱名、调、调号
  7. games101 材质与外观
  8. This request has been blocked; the content must be served over HTTPS.
  9. 收款码在线生成系统源码 无限制 (web微信、QQ、支付宝三合一收款码)
  10. 从菜鸟到架构师(六)
  11. 中国90%的SaaS都亏钱,为何这家公司偏偏盈利千万
  12. 时间同步装置(时钟系统)工作模式介绍
  13. Promise、Promise.all 和Promise.race用法
  14. 淘宝(SpringBoot自动装配原理)
  15. matlab 路由表,闭关修炼之zigbee路由
  16. 计算机网络功能中的提高系统的可靠性指的是,下列不属于计算机网络功能的是()。A.提高系统可靠性B.提高工作效率C.分散数据的综合处理D.使...
  17. 智能优化算法:北方苍鹰优化算法-附代码
  18. 【前端工程化】配置package.json中scripts命令脚本,新手必学
  19. kettle实现数据增量同步方案
  20. python爬取分页数据_爬虫抓取分页数据的简单实现

热门文章

  1. CentOS8服务篇5:使用Postfix与Dovecot部署电子邮件系统
  2. elasticsearch中term与match
  3. 2020年 9 大程序员接私活的网站
  4. 一二三四五,勾勒新华三云蓝图
  5. QML拖拽GridView元素重新排序示例
  6. JAVA_输出5笔购物金额和总金额
  7. android usb充电电流,插线板上的USB口能不能给手机充电?
  8. linux ip路由不可达原理,traceroute原理
  9. 抖音小店评价申诉问题|四川鹰迪
  10. Mac如何安装telnet命令