`

日初将TN表数据同步到T0表

 
阅读更多

最近参与了一个项目,发现里面的代码程序写的好厉害大笑,摘取下来以便学习。

create or replace function DATA_TN_2_T0(
P_INIT_DATE NUMBER(10),-----交易日期
P_ERROR_NO OUT NUMBER(10),----错误代码
P_ERROR_INFO OUT VARCHAR2(100)-----错误信息
)
RETURN NUMBER AS
V_ROWCOUNT NUMBER(10);----记录数
V_COLUMNSTR VARCHAR2(4000);-----数据表属性
V_SQLSTR VARCHAR2(4000);  -----执行的sql语句
V_WHERESTR VARCHAR2(4000); -----where条件

BEGIN
   FOR V_CUR IN (  
       SELECT USER_NAME,
              TABLE_NAME,   
              BAK_TABLE_NAME,
              REMARK,
              WHERE_STR,
              INDEX_MODE
              FROM BAKCONFIG  ----从配置表里面查询需要同步的TN表及对应的T0表,及用户名等
              WHERE ...
            )LOOP
     SELECT COUNT(*) INTO V_ROWCOUNT
     FROM ALL_ALL_TABLES
     WHERE UPPER(OWNER)=UPPER(V_CUR.USER_NAME)
     AND UPPER(TABLE_NAME)=UPPER(V_CUR.BAK_TABLE_NAME);----查询用户是否有操作该数据表的权限
     IF V_ROWCOUNT>0 THEN
        BEGIN
        V_COLUMNSTR :=' ';
        FOR V_COLUMN IN (
           SELECT U.COLUMN_NAME
              FROM (SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS 
                  WHERE UPPER(OWNER)=UPPER(V_CUR.USER_NAME)
                  AND TABLE_NAME=UPPER(V_CUR.TABLE_NAME))U,
                   (SELECT COLUMN FROM ALL_TAB_COLUMNS
                  WHERE UPPER(OWNER)=UPPER(V_CUR.USER_NAME)
                  AND TABLE_NAME=UPPER(V_CUR.BAK_TABLE_NAME))L
             WHERE U.COLUMN_NAME=L.COLUMN_NAME  ---找出TN与T0表共有的属性
           )LOOP
          ----拼接成字符串
          V_COLUMNSTR:=V_COLUMNSTR || V_COLUMN.COLUMN_NAME || ',';
          END LOOP;
          V_COLUMNSTR:=SUBSTR(V_COLUMNSTR,2,LENGTH(V_COLUMNSTR)-2);
         ----获取表的索引处理
         IF V_CUR.INDEX_MODE='1' THEN
           INSERT INTO TMP_INDEX(INDEX_NAME,USER_NAME,TABLE_NAME,REMARK)
           SELECT INDEX_NAME,TABLE_OWNER,TABLE_NAME,
           DBMS_METADATA.GET_DDL('INDEX',INDEX_NAME,TABLE_OWNER)
           FROM USER_INDEXES
           WHERE TABLE_OWNER=V_CUR.USER_NAME
           AND TABLE_NAME=UPPER(V_CUR.BAK_TABLE_NAME);
        END IF;
      ---删除T0表数据
      EXECUTE IMMEDIATE 'TRUNCATE TABLE '|| V_CUR.USER_NAME ||'.'||
      UPPER(V_CUR.BAK_TABLE_NAME);
      ----删除表索引
      FOR IDX_CUR IN(SELECT * FROM TMP_INDEX)LOOP
      V_SQLSTR:='DROP INDEX '|| IDX_INDEX.USER_NAME ||'.'||IDX_CUR.INDEX_NAME;
      EXECUTE IMMEDIATE V_SQLSTR;
      END LOOP;
      ----处理where条件
      IF RITRIM(V_CUR.WHERE_STR) IS NOT NULL THEN
        V_WHERESTR:='WHERE'||V_CUR.WHERE_STR;
      ELSE
        V_WHERESTR:=' ';
      END IF;
      -----将日期换成当前的交易日
      V_WHERESTR:=REPLACE(V_WHERESTR,'#INIT_DATE#',P_INIT_DATE);
      ------拼接执行语句  
      V_SQLSTR:='INSERT /*+APPEND*/INTO '|| V_CUR.USER_NAME ||'.'||
                UPPER(V_CUR.BAK_TABLE_NAME)||'nologging('||
                V_COLUMNSTR || ')'||'SELECT '|| V_COLUMNSTR||
                ' FROM  '||V_CUR.USER_NAME ||'.'||
                V_CUR.TABLE_NAME || V_WHERESTR;
      ------执行语句
      EXECUTE IMMEDIATE V_SQLSTR;
      ----创建索引
      FOR IDX_CUR IN (SELECT * FROM TMP_INDEX)LOOP
          V_SQLSTR:=IDX_CUR.REMARK;
          EXECUTE IMMEDIATE V_SQLSTR;
      END LOOP;
      EXECUTE IMMEDIATE 'TRUNCATE TABLE TMP_INDEX';
      COMMIT;
    END;
   END IF;
 END LOOP;
 COMMIT;
 RETURN (0);
 EXCEPTION
     WHEN OTHERS THEN
     ROLLBACK;
     P_ERROR_NO     :=101;
     P_ERROR_INFO  :='执行存储过程错误'||'DATA_TN_2_T0';
     RETURN (P_ERROR_NO);
END; 
 
分享到:
评论

相关推荐

    2015年下半年 系统架构设计师 综合知识.docx

    接着,系统中事务的等待状态描述了一个死锁的场景,其中事务形成一个环形等待链,即T0等待T1,T1等待T2,以此类推,直到Tn-1等待T0,这符合死锁的定义。 在分布式数据库中,分片透明、复制透明、位置透明和逻辑透明...

    15综合1

    在数据库管理系统中,当事务Ti等待被Ti+1锁住的数据项,形成一个循环等待链,即T0->T1->T2...->Tn-1->T0,这种情况称为死锁。题目中的描述符合这种状态,因此答案是B.死锁。 【知识点4】:分布式数据库透明性 位置...

    计算机组成控制单元的设计(与“微指令”有关的文档共54张).pptx

    节拍信号如CLK、T0到Tn,定义了时钟周期和机器周期,它们决定了微操作的执行顺序和时间。 在设计控制单元时,节拍的安排至关重要。通常采用同步控制方式,即所有部件都按照同一时钟信号进行操作。例如,一个机器...

    Chebyshev多项式在PPP卫星钟内插计算中的应用研究.pdf

    Chebyshev多项式可以通过递推关系建立,如To(θ) = 1, T1(θ) = θ,以及对于n>=2的递推公式Tn(θ) = 2θTn-1(θ) - Tn-2(θ)。在选择m(m > n + 1)个时间点进行拟合时,可以利用最小二乘法原理求解系数矩阵C,从而...

    计算机组成控制单元的设计优秀(与“微指令”有关的文档共52张).pptx

    IR主要用于存储当前执行的指令,节拍发生器则负责生成控制单元操作的时间基准信号,比如CLK、T0、T1、Tn等,这些节拍信号是基于时钟周期的同步控制方式来组织的。一个机器周期通常由多个时钟周期组成,例如文档中...

    2008银行笔试真题

    **题目**: 系统进行了一系列的操作:T0到T1发送A1,T1到T2发送A2,…,Tn-1到Tn发送An,Tn到T0发送A0。描述这一系列操作后的系统状态。 **选项**: - A. 循环状态 - B. 死锁状态 - C. 饥饿状态 - D. 正常状态 **...

Global site tag (gtag.js) - Google Analytics