`
流浪鱼
  • 浏览: 1673361 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

pl/sql编程简绍

 
阅读更多

简绍pl/sql编程的

https://www.cnblogs.com/defias/p/3334098.html

 declare
 V_FIRST  NUMBER := 0;
 begin
   DBMS_OUTPUT.put_line('######执行初始化####');
  for i in (select t.id,t.name from t_rpt_jys t ) loop
   V_FIRST := i.id ;
   DBMS_OUTPUT.put_line(V_FIRST);
   end loop;
  end;

 复杂一点例子

DECLARE
  BEGIN_DATE           VARCHAR2(32);
  V_FIRST              NUMBER := 0;
  V_COUNT1             NUMBER := 0;
  V_COUNT              NUMBER := 0;
  V_COUNT_SUB          NUMBER := 0;
  V_PRE_DAY_NET_AMOUNT NUMBER := 0;
  V_MEMBER_ID          COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT.MEMBER_ID%TYPE;
  V_ACCOUNT_ID         COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT.ACCOUNT_ID%TYPE;
  V_BUSINESS_DATE      COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT.BUSINESS_DATE%TYPE;
  V_BALANCE            COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT.BALANCE%TYPE; -- 账户余额
  V_ACCRUAL            COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT.ACCRUAL%TYPE; -- 发生额
  V_CHANNEL_FEE        COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT.SETTLE_CHANNEL_FEE%TYPE; -- 结算渠道费
  V_NET_AMOUNT         COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT.NET_AMOUNT%TYPE; -- 净额
BEGIN
  DBMS_OUTPUT.put_line('######初始化日报表信息开始,请务必等待执行结束####');
  for I in (SELECT A.MEMBER_ID,
                   M.MEMBER_NAME,
                   A.ACCOUNT_ID,
                   A.CREATE_TIME,
                   A.ACCOUNT_TYPE
              FROM MEMBER.TR_MEMBER_ACCOUNT A, MEMBER.TM_MEMBER M
             WHERE A.MEMBER_ID = M.MEMBER_ID
               AND A.ACCOUNT_ID IS NOT NULL
             ORDER BY A.CREATE_TIME ASC) LOOP
    BEGIN_DATE := TO_CHAR(I.CREATE_TIME, 'YYYY-MM-DD');
    WHILE BEGIN_DATE < TO_CHAR(SYSDATE, 'YYYY-MM-DD') LOOP
    
      -- 发生额
      SELECT --T.ACCOUNT_NO,
       NVL(TT.SUM_TXN_AMT, '0.00')
        INTO V_ACCRUAL
        FROM DPM.T_DPM_OUTER_ACCOUNT T
        LEFT JOIN (SELECT TT1.ACCOUNT_NO,
                          (SUM_TXN_AMT1 - SUM_TXN_AMT2) SUM_TXN_AMT
                     FROM (SELECT T1.ACCOUNT_NO, SUM(T1.TXN_AMT) SUM_TXN_AMT1
                             FROM DPM.T_DPM_OUTER_ACCOUNT_DETAIL T1
                            WHERE T1.DIRECTION = '1'
                              AND T1.TXN_TIME <
                                  TO_DATE(BEGIN_DATE || ' 05:00:00',
                                          'yyyy-mm-dd hh24:mi:ss') + 1
                              AND T1.TXN_TIME >
                                  TO_DATE(BEGIN_DATE || ' 05:00:00',
                                          'yyyy-mm-dd hh24:mi:ss')
                            GROUP BY T1.ACCOUNT_NO) TT1
                     JOIN (SELECT T2.ACCOUNT_NO, SUM(T2.TXN_AMT) SUM_TXN_AMT2
                            FROM DPM.T_DPM_OUTER_ACCOUNT_DETAIL T2
                           WHERE T2.DIRECTION = '2'
                             AND T2.TXN_TIME <
                                 TO_DATE(BEGIN_DATE || ' 05:00:00',
                                         'yyyy-mm-dd hh24:mi:ss') + 1
                             AND T2.TXN_TIME >
                                 TO_DATE(BEGIN_DATE || ' 05:00:00',
                                         'yyyy-mm-dd hh24:mi:ss')
                           GROUP BY T2.ACCOUNT_NO) TT2
                       ON TT1.ACCOUNT_NO = TT2.ACCOUNT_NO) TT
          ON T.ACCOUNT_NO = TT.ACCOUNT_NO
       WHERE T.ACCOUNT_NO = I.ACCOUNT_ID;
    
      -- 结算渠道费
      SELECT --TT1.ACCOUNT_NO,
       (NVL(TT1.SUB_AMT, '0.00') - NVL(TT2.SUB_AMT, '0.00'))
        INTO V_CHANNEL_FEE
        FROM (SELECT O1.ACCOUNT_NO, T2.SUB_AMT
                FROM DPM.T_DPM_OUTER_ACCOUNT O1
                LEFT JOIN (SELECT UNIQUE T1.ACCOUNT_NO,
                                 T1.DIRECTION,
                                 SUM(T1.AMOUNT) OVER(PARTITION BY T1.ACCOUNT_NO, T1.DIRECTION) SUB_AMT
                            FROM DPM.T_DPM_ACCOUNT_ENTRY T1
                           WHERE T1.DIRECTION = '1'
                             AND t1.LAST_UPDATE_TIME <
                                 TO_DATE(BEGIN_DATE || ' 05:00:00',
                                         'yyyy-mm-dd hh24:mi:ss') + 1
                             AND t1.LAST_UPDATE_TIME >
                                 TO_DATE(BEGIN_DATE || ' 05:00:00',
                                         'yyyy-mm-dd hh24:mi:ss')
                             AND T1.SYS_TRACE_NO LIKE 'FEE%') T2
                  ON O1.ACCOUNT_NO = T2.ACCOUNT_NO) TT1
        LEFT JOIN (SELECT O1.ACCOUNT_NO, T2.SUB_AMT
                     FROM DPM.T_DPM_OUTER_ACCOUNT O1
                     LEFT JOIN (SELECT UNIQUE T1.ACCOUNT_NO,
                                      T1.DIRECTION,
                                      SUM(T1.AMOUNT) OVER(PARTITION BY T1.ACCOUNT_NO, T1.DIRECTION) SUB_AMT
                                 FROM DPM.T_DPM_ACCOUNT_ENTRY T1
                                WHERE T1.DIRECTION = '2'
                                  AND t1.LAST_UPDATE_TIME <
                                      TO_DATE(BEGIN_DATE || ' 05:00:00',
                                              'yyyy-mm-dd hh24:mi:ss') + 1
                                  AND t1.LAST_UPDATE_TIME >
                                      TO_DATE(BEGIN_DATE || ' 05:00:00',
                                              'yyyy-mm-dd hh24:mi:ss')
                                  AND T1.SYS_TRACE_NO LIKE 'FEE%') T2
                       ON O1.ACCOUNT_NO = T2.ACCOUNT_NO) TT2
          ON TT1.ACCOUNT_NO = TT2.ACCOUNT_NO
       WHERE TT2.ACCOUNT_NO = I.ACCOUNT_ID;
    
      -- 账户余额
      SELECT AFTER_AMT
        INTO V_BALANCE
        FROM MEMBER.TR_MEMBER_ACCOUNT A
        LEFT JOIN (select A.*
                     from (select AD.*,
                                  row_number() over(partition by AD.ACCOUNT_NO order by AD.TXN_TIME desc) rw
                             from DPM.T_DPM_OUTER_ACCOUNT_DETAIL AD
                            WHERE AD.TXN_TIME <
                                  TO_DATE(BEGIN_DATE || ' 05:00:00',
                                          'yyyy-mm-dd hh24:mi:ss') + 1) A
                    where A.rw = 1) T
          ON A.ACCOUNT_ID = T.ACCOUNT_NO
       WHERE A.ACCOUNT_ID = I.ACCOUNT_ID;
      ----为空的情况--
      IF V_BALANCE IS NULL THEN
        ---查询
        SELECT COUNT(1)
          INTO V_COUNT
          FROM DPM.T_DPM_OUTER_ACCOUNT_DETAIL CO
         WHERE CO.ACCOUNT_NO = I.ACCOUNT_ID;
        IF V_COUNT = 0 THEN
          SELECT COUNT(1)
            INTO V_COUNT_SUB
            from dpm.t_dpm_outer_account_subset da
           where da.account_no = I.ACCOUNT_ID;
          IF V_COUNT_SUB = 0 THEN
            V_BALANCE := 0.00;
          ELSE
            select SUM(DA.BALANCE)
              INTO V_BALANCE
              from dpm.t_dpm_outer_account_subset da
             where da.account_no = I.ACCOUNT_ID;
          
          END IF;
        ELSE
          SELECT BEFORE_AMT
            INTO V_BALANCE
            FROM (SELECT DO.BEFORE_AMT
                    FROM DPM.T_DPM_OUTER_ACCOUNT_DETAIL DO
                   WHERE DO.ACCOUNT_NO = I.ACCOUNT_ID
                   ORDER BY DO.TXN_TIME ASC)
           WHERE ROWNUM = 1;
        
        END IF;
      END IF;
    
      -- 净额
      SELECT COUNT(1)
        INTO V_FIRST
        FROM COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT BAL
       WHERE BAL.ACCOUNT_ID = I.ACCOUNT_ID
         AND TO_CHAR(BAL.BUSINESS_DATE, 'YYYY-MM-DD') =
             TO_CHAR(TO_DATE(BEGIN_DATE, 'YYYY-MM-DD') - 1);
      IF V_FIRST = 0 THEN
        V_NET_AMOUNT := V_ACCRUAL - V_CHANNEL_FEE;
      ELSE
        SELECT NVL(NET_AMOUNT, 0)
          INTO V_PRE_DAY_NET_AMOUNT
          FROM COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT BAL
         WHERE TO_CHAR(BAL.BUSINESS_DATE, 'YYYY-MM-DD') =
               TO_CHAR(TO_DATE(BEGIN_DATE, 'YYYY-MM-DD') - 1);
        V_NET_AMOUNT := V_ACCRUAL - V_CHANNEL_FEE + V_PRE_DAY_NET_AMOUNT;
      END IF;
    
      SELECT COUNT(1)
        INTO V_COUNT
        FROM COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT BAL
       WHERE BAL.ACCOUNT_ID = I.ACCOUNT_ID
         AND TO_CHAR(BAL.BUSINESS_DATE, 'YYYY-MM-DD') = BEGIN_DATE;
      IF V_COUNT = 0 THEN
        INSERT INTO COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT
          (ID,
           MEMBER_ID,
           MEMBER_NAME,
           ACCOUNT_ID,
           ACCOUNT_TYPE,
           BUSINESS_DATE,
           ACCRUAL,
           SETTLE_CHANNEL_FEE,
           BALANCE,
           NET_AMOUNT,
           CREATE_DATE)
        VALUES
          (COUNTER.SEQ_TB_MARKET_DAY_REPORT.NEXTVAL,
           I.MEMBER_ID,
           I.MEMBER_NAME,
           I.ACCOUNT_ID,
           I.ACCOUNT_TYPE
           TO_DATE(BEGIN_DATE || ' 05:00:00', 'yyyy-mm-dd hh24:mi:ss'),
           V_ACCRUAL,
           V_CHANNEL_FEE,
           V_BALANCE,
           V_NET_AMOUNT,
           SYSDATE);
      
      ELSE
        UPDATE COUNTER.TB_MARKET_ACCOUNT_DAY_REPORT BAL
           SET BAL.ACCRUAL            = V_ACCRUAL,
               BAL.SETTLE_CHANNEL_FEE = V_CHANNEL_FEE,
               BAL.BALANCE            = V_BALANCE
         WHERE BAL.ACCOUNT_ID = I.ACCOUNT_ID
           AND TO_CHAR(BAL.BUSINESS_DATE, 'YYYY-MM-DD') = BEGIN_DATE;
      END IF;
    
      BEGIN_DATE := TO_CHAR(TO_DATE(BEGIN_DATE, 'YYYY-MM-DD') + 1,
                            'YYYY-MM-DD');
      COMMIT;
    END LOOP;
  
  END LOOP;
  DBMS_OUTPUT.put_line('######初始化日报表信息结束######');

END;

  

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    网络Winsock编程

    详细 简明的Winsock编程简绍 tcp/udp的简建立、连接于释放详解

    strcpy的详细简绍

    `strcpy`函数是C语言标准库中用于字符串复制的一个关键函数。...在实际编程中,应考虑使用更安全的替代品,如`strncpy`(尽管它也有其自身的局限),或者在C++中使用`std::string`类,以获得更好的内存管理和安全特性。

    fanuc PMC功能与PMC编程器的操作

    描述:“简绍了fanuc的PMC功能指令和机床编程器的用法” ### FANUC PMC 功能详解及编程操作指南 FANUC PMC(Programmable Machine Controller)是FANUC CNC系统中的一个重要组成部分,用于控制机床的辅助功能和...

    GIS简绍和PDF

    2. C#编程基础:C#语言在GIS开发中的应用,基础语法和面向对象编程概念。 3. ArcEngine API:学习如何使用ArcEngine的API来创建地图、添加图层、进行空间分析等。 4. GIS应用程序开发:通过实例讲解如何使用C#和Arc...

    桥规主要修订内容简绍.pdf

    桥规主要修订内容简绍.pdf

    球队简绍 flash,欢迎大家下载,我不要积分

    标题中的“球队简绍 flash”表明这是一个关于篮球球队介绍的Flash动画项目,可能是为了展示球队的历史、成员或者比赛情况。Flash是一种广泛应用于创建交互式内容、网页动画和多媒体项目的软件,由Adobe公司开发。在...

    机修钳工视频简绍简介

    【标题】"机修钳工视频简绍简介" 涉及的核心知识点是关于机修钳工这一职业的技能和工作内容,通过视频形式进行教学和学习。在工业生产领域,机修钳工是一个至关重要的角色,他们主要负责机械设备的安装、维护、修理...

    Oracle SQL 內置函數大全 Oracle SQL function.ppt

    简绍oracle的内置函数,方便查看

    淘宝开店简绍代码

    虚拟店必备工具,淘宝专用

    Spring Boot 简绍1

    【Spring Boot 简介】 Spring Boot 是一个由 Pivotal 团队开发的 Java 框架,其设计目标是为了简化新 Spring 应用的初始搭建以及开发过程。Spring Boot 不是 Spring 框架的替代品,而是提供了一种快速配置 Spring ...

    ls-dyna预应力加载简绍_相当详细.pdf

    ls-dyna预应力加载简绍_相当详细.pdf

    数据库sqlserver查询语句

    对数据库查询语句的简绍.此文档主要针对sqlserver的一些简单查询语句的介绍。

    SHELL 编程详解

    UNIX shell 编程详解,详细具体简绍shell编程从入门到高级应用

    C语言文件简绍

    C语言是一种强大的编程语言,它的灵活性和效率使其广泛应用于系统编程、嵌入式开发以及软件开发等多个领域。在C语言中,头文件是至关重要的,它们提供了预定义的函数、常量、数据类型和宏,使得程序员能够方便地使用...

    电信宽带设备简绍和工作原理

    ### 电信宽带设备简绍和工作原理 #### 一、概述 随着信息技术的快速发展,宽带网络已成为现代生活不可或缺的一部分。为了满足不断增长的数据传输需求,电信运营商广泛采用各种先进的网络技术和设备来提升服务质量和...

    嵌入式GUI简绍

    通过简单的`dd`命令或编程接口(如`mmap`和`memset`),开发者可以轻松地控制屏幕内容,这极大地简化了图形编程的复杂度,提高了效率。 #### 高级图形库与GUI系统 在理解了基础图形设施后,嵌入式Linux系统还提供...

    iText简绍及操作PDF文件

    iText 是一款流行的 Java 和 .NET 平台上的 PDF 文档处理库,用于创建、编辑和操作 PDF 文件。本篇文章将介绍如何使用 iText 创建 PDF 文件,特别是关注如何解决中文显示问题。 首先,我们来看创建一个简单的 PDF ...

    51单片机的看门狗简绍

    【51单片机的看门狗介绍】 51单片机中的看门狗功能是一种重要的自我保护机制,尤其在STC89c51这类单片机中,它的作用在于防止程序因受到外界干扰而发生异常,陷入无限循环,导致系统失效。看门狗电路监控着单片机的...

    JAVA EL 表达式的简单简绍

    ### JAVA EL 表达式的简单介绍 #### 一、JSPEL语言定义及目的 EL (Expression Language) 是 JavaServer Pages (JSP) 技术的一部分,它的主要目的是简化 JSP 页面中的数据检索过程,使得开发者能够更方便地在 JSP ...

    java线程入门,一本简绍java线程的书

    Java线程是Java编程语言中的一个关键概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是程序执行的最小单元,由JVM(Java虚拟机)来管理和调度。Java线程的入门学习至关重要,...

Global site tag (gtag.js) - Google Analytics