zoukankan      html  css  js  c++  java
  • oracle中的存储过程(实例一)

    引子

    这是公司测试环境的老问题了。

    业务系统的生产环境,有专人配置基础数据,有运维人员管理。而测试环境没有人员维护,基础配置信息数据过期后,导致系统无法正常使用。

    以往的解决办法:

    1. 联系外围管理系统(销售管理系统)负责人协助配置。

    2. 配置信息,审核通过后同步到核心,确认后可以使用。

    下面进入正题,存过实现迁移生产环境数据到测试环境

    1. 解决方案(版本1.1)

    工具:数据库存过

    思路:需要导入数据的表放在数据库中。遍历这些表,在遍历过程中先删除表中符合条件的数据,然后将生产环境符合条件的数据迁入到当前环境中

       /*****************************************************************************
       * Name: P_IMPORT_CHA_DATA
       * PROCEDURE: 导生产环境基础数据(代理人信息)
       * Paramater: IC_C_CHA_CDE 代理人代码
       * Programmer: lyt
       * Date: 2019/10/12
       * Update:
       * 需导入表配置:T_IMPORT_TABLE WHERE C_MARK = '2';
       * 维护dbquery中间库表结构:SELECT 'CREATE TABLE T_' || C_TABLE || ' AS SELECT * FROM ZSSYS.' || C_TABLE || ' WHERE ROWNUM = 0;',A.* FROM T_IMPORT_TABLE A;
       * 如果手续费打包时提示:算税平台找不到该代理人,需联系算税平台(沈一栋)邵先路,将算税生产环境信息同步到对应环境
      *****************************************************************************/
     
      PROCEDURE P_IMPORT_CHA_DATA(IC_C_CHA_CDE VARCHAR2) AS
        LB_SQL      CLOB;
        LB_COLS     CLOB;
        LB_COND     CLOB;
        LN_ROWS     NUMBER;
        CURSOR CUR_TABLE IS
          SELECT * FROM T_IMPORT_TABLE WHERE C_MARK = '2';
      BEGIN     
        FOR LR_TABLE IN CUR_TABLE LOOP
        
          SELECT WM_CONCAT(COLUMN_NAME)
            INTO LB_COLS
            FROM USER_TAB_COLS@LINK_CORE
           WHERE TABLE_NAME = 'T_' || UPPER(LR_TABLE.C_TABLE)
           ORDER BY COLUMN_ID;
        
          LB_COND := ' WHERE ';
          
          IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_COM_ACCT') THEN
            LB_COND := LB_COND || 'C_REL_CDE ';
          ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER') THEN
            LB_COND := LB_COND || 'C_CLNT_CDE ';
          ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER') THEN
            LB_COND := LB_COND || 'C_AGT_AGR_NO IN (SELECT C_AGT_AGR_NO FROM ZSSYS.WEB_CUS_CONFER  WHERE C_CLNT_CDE';
          ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
            LB_COND := LB_COND || 'C_SLS_CDE IN(SELECT C_SLS_CDE FROM ZSSYS.WEB_CUS_CHA WHERE C_CHA_CDE';
          ELSE
            LB_COND := LB_COND || 'C_CHA_CDE ';
          END IF;
                  
          IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER' OR UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
            LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || ''')';
          ELSE
            LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || '''';
          END IF;
          
          LB_SQL := 'DELETE FROM ZSSYS.' || LR_TABLE.C_TABLE || LB_COND;
          
          EXECUTE IMMEDIATE LB_SQL;
    
          LB_SQL := 'INSERT INTO ZSSYS.' || LR_TABLE.C_TABLE || '(' || LB_COLS ||
          ')  SELECT ' || LB_COLS || ' FROM ' || 'ZSSYS.' ||
                    LR_TABLE.C_TABLE || '@LINK_CORE '|| LB_COND;
                    
          EXECUTE IMMEDIATE LB_SQL;
        END IF;
        END LOOP;
        --COMMIT;
      END P_IMPORT_CHA_DATA;

    涉及知识点

    1.1  oracle 中的for循环

    FOR LR_TABLE IN CUR_TABLE LOOP
    END LOOP;

    1.2  oracle 中的条件分支语句

    IF () THEN
    ...;
    ELSIF () THEN
    ...;
    ELSE
    ...;
    END IF;

    1.3  存过中入参

    1.4  游标 cursor

       Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor)。 

    1). 隐式游标:无需定义,Select /Update / Insert/Delete操作,就是隐式Cursor

    2). 显式游标:

    cursor <cursor>[(<param_list>)]is <select_statement>;

    3). 动态游标:

    Type [Cursor type name] is ref cursor 

    游标的属性(4个)1.found  2.notfound  3.rowcount  4.isopen

    2. 存过怎么调试?

    2.1 如何打断点

     2.2  如何调试

    首先在左侧列表中,选中对应存过,右键后点击add debug informaintion(添加调试信息),然后在点Test,显示如下页面:

     最上面一排是debug相关按键区域,中间为代码显示部分,左下为变量值显示区域(填写变量名称,执行过程中查看变量值)

    2. 解决方案(版本1.2)

    版本1.1存在的问题:由于部分表之间存在外键约束,导致删除操作失败。

    解决思路:先反向遍历表完成全部删除操作(删除符合条件的数据),在遍历表完成插入操作,这里用到动态索引

      /*****************************************************************************
       * Name: P_IMPORT_CHA_DATA
       * PROCEDURE: 导生产环境基础数据(代理人信息)
       * Paramater: IC_C_CHA_CDE 代理人代码
       * Programmer: lyt
       * Date: 2019/10/12
       * Update:
       * 需导入表配置:T_IMPORT_TABLE WHERE C_MARK = '2';
       * 如果手续费打包时提示:算税平台找不到该代理人,需联系算税平台(沈一栋)邵先路,将算税生产环境信息同步到对应环境
      *****************************************************************************/
    
      PROCEDURE P_IMPORT_CHA_DATA(IC_C_CHA_CDE VARCHAR2) AS
        TYPE ref_cursor_type IS REF CURSOR;
        CUR_TABLE ref_cursor_type;
        LR_TABLE  ZSSYS.T_IMPORT_TABLE%ROWTYPE;
        LB_SQL    CLOB;
        LB_COLS   CLOB;
        LB_COND   CLOB;
      BEGIN
        FOR i IN 1 .. 2 LOOP
        
          IF (i = 1) THEN
            OPEN CUR_TABLE FOR
              SELECT *
                FROM ZSSYS.T_IMPORT_TABLE
               WHERE C_MARK = '2'
               ORDER BY C_TABLE_NO DESC;
          ELSE
            OPEN CUR_TABLE FOR
              SELECT *
                FROM ZSSYS.T_IMPORT_TABLE
               WHERE C_MARK = '2'
               ORDER BY C_TABLE_NO;
          END IF;
        
          LOOP
            FETCH CUR_TABLE
              INTO LR_TABLE;
            EXIT WHEN CUR_TABLE%NOTFOUND;
          
            SELECT WM_CONCAT(COLUMN_NAME)
              INTO LB_COLS
              FROM DBA_TAB_COLS@LINK_CORE
             WHERE TABLE_NAME = 'T_' || UPPER(LR_TABLE.C_TABLE)
               AND OWNER = 'ZSSYS'
             ORDER BY COLUMN_ID;
          
            LB_COND := ' WHERE ';
          
            IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_COM_ACCT') THEN
              LB_COND := LB_COND || 'C_REL_CDE ';
            ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER') THEN
              LB_COND := LB_COND || 'C_CLNT_CDE ';
            ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
                  UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER') THEN
              LB_COND := LB_COND ||
                         'C_AGT_AGR_NO IN (SELECT C_AGT_AGR_NO FROM ZSSYS.WEB_CUS_CONFER@LINK_CORE  WHERE C_CLNT_CDE';
            ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
              LB_COND := LB_COND ||
                         'C_SLS_CDE IN(SELECT C_SLS_CDE FROM ZSSYS.WEB_CUS_CHA@LINK_CORE WHERE C_CHA_CDE';
            ELSE
              LB_COND := LB_COND || 'C_CHA_CDE ';
            END IF;
          
            IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
               UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER' OR
               UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
              LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || ''')';
            ELSE
              LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || '''';
            END IF;
          
            IF (i = 1) THEN
              LB_SQL := 'DELETE FROM ZSSYS.' || LR_TABLE.C_TABLE || LB_COND;
            ELSE
              LB_SQL := 'INSERT INTO ZSSYS.' || LR_TABLE.C_TABLE || '(' ||
                        LB_COLS || ')  SELECT ' || LB_COLS || ' FROM ' ||
                        'ZSSYS.' || LR_TABLE.C_TABLE || '@LINK_CORE' || LB_COND;
            END IF;
            EXECUTE IMMEDIATE LB_SQL;
          
          END LOOP;
          IF CUR_TABLE%ISOPEN THEN
            --close cursor
            CLOSE CUR_TABLE;
          END IF;
        END LOOP;
      END P_IMPORT_CHA_DATA;
      /*****************************************************************************
       * Name: F_GET_LB_SQL
       * PROCEDURE: 导生产环境基础数据(代理人信息)
       * Return: LB_COND 
       * Programmer: lyt
       * Date: 2019/10/24
       * Update:
      *****************************************************************************/
    
      FUNCTION F_GET_LB_SQL(C_TABLE      IN VARCHAR2, --表名
                            IC_C_CHA_CDE IN VARCHAR2, --业务员编号
                            LB_COLS      IN OUT CLOB --表对应字段
                            ) RETURN CLOB IS
        LB_COND CLOB := '';
      BEGIN
        SELECT WM_CONCAT(COLUMN_NAME)
          INTO LB_COLS
          FROM DBA_TAB_COLS@LINK_CORE
         WHERE TABLE_NAME = UPPER(C_TABLE)
           AND OWNER = 'ZSSYS'
         ORDER BY COLUMN_ID;
      
        LB_COND := ' WHERE ';
        IF (UPPER(C_TABLE) = 'WEB_CUS_COM_ACCT') THEN
          LB_COND := LB_COND || 'C_REL_CDE ';
        ELSIF (UPPER(C_TABLE) = 'WEB_CUS_CONFER') THEN
          LB_COND := LB_COND || 'C_CLNT_CDE ';
        ELSIF (UPPER(C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
              UPPER(C_TABLE) = 'WEB_AUTH_CONFER') THEN
          LB_COND := LB_COND ||
                     'C_AGT_AGR_NO IN (SELECT C_AGT_AGR_NO FROM ZSSYS.WEB_CUS_CONFER@LINK_CORE  WHERE C_CLNT_CDE';
        ELSIF (UPPER(C_TABLE) = 'WEB_ORG_SALES') THEN
          LB_COND := LB_COND ||
                     'C_SLS_CDE IN(SELECT C_SLS_CDE FROM ZSSYS.WEB_CUS_CHA@LINK_CORE WHERE C_CHA_CDE';
        ELSE
          LB_COND := LB_COND || 'C_CHA_CDE ';
        END IF;
      
        IF (UPPER(C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
           UPPER(C_TABLE) = 'WEB_AUTH_CONFER' OR
           UPPER(C_TABLE) = 'WEB_ORG_SALES') THEN
          LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || ''')';
        ELSE
          LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || '''';
        END IF;
        RETURN LB_COND;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          dbms_output.put_line('表:' || C_TABLE || '找不到');
      END F_GET_LB_SQL;
      /*****************************************************************************
       * Name: P_IMPORT_CHA_DATA2
       * PROCEDURE: 导生产环境基础数据(代理人信息)
       * Paramater: IC_C_CHA_CDE 代理人代码
       * Programmer: lyt
       * Date: 2019/10/24
       * Update:
       * 需导入表配置:T_IMPORT_TABLE WHERE C_MARK = '2';
       * 如果手续费打包时提示:算税平台找不到该代理人,需联系算税平台(沈一栋)邵先路,将算税生产环境信息同步到对应环境
      *****************************************************************************/
    
      PROCEDURE P_IMPORT_CHA_DATA2(IC_C_CHA_CDE VARCHAR2) AS
        TYPE ref_cursor_type IS REF CURSOR;
        CUR_TABLE ref_cursor_type;
        LR_TABLE  ZSSYS.T_IMPORT_TABLE%ROWTYPE;
        LB_SQL    CLOB;
        LB_COLS   CLOB;
        LB_COND   CLOB;
      BEGIN
        FOR i IN 1 .. 2 LOOP
          --删除已有数据
          IF (i = 1) THEN
            OPEN CUR_TABLE FOR
              SELECT *
                FROM ZSSYS.T_IMPORT_TABLE
               WHERE C_MARK = '2'
               ORDER BY C_TABLE_NO DESC;
            LOOP
              FETCH CUR_TABLE
                INTO LR_TABLE;
              EXIT WHEN CUR_TABLE%NOTFOUND;
              LB_SQL := 'DELETE FROM ZSSYS.' || LR_TABLE.C_TABLE ||
                        F_GET_LB_SQL(LR_TABLE.C_TABLE, IC_C_CHA_CDE, LB_COLS);
              EXECUTE IMMEDIATE LB_SQL;
            END LOOP;
          ELSE
           --插入数据
            OPEN CUR_TABLE FOR
              SELECT *
                FROM ZSSYS.T_IMPORT_TABLE
               WHERE C_MARK = '2'
               ORDER BY C_TABLE_NO;
            LOOP
              FETCH CUR_TABLE
                INTO LR_TABLE;
              EXIT WHEN CUR_TABLE%NOTFOUND;
              LB_COND := F_GET_LB_SQL(LR_TABLE.C_TABLE, IC_C_CHA_CDE, LB_COLS);
              LB_SQL  := 'INSERT INTO ZSSYS.' || LR_TABLE.C_TABLE || '(' ||
                         LB_COLS || ')  SELECT ' || LB_COLS || ' FROM ' ||
                         'ZSSYS.' || LR_TABLE.C_TABLE || '@LINK_CORE' ||
                         LB_COND;
              EXECUTE IMMEDIATE LB_SQL;
            END LOOP;
          END IF;
        
          IF CUR_TABLE%ISOPEN THEN
            --close cursor
            CLOSE CUR_TABLE;
          END IF;
        END LOOP;
      END P_IMPORT_CHA_DATA2;
  • 相关阅读:
    软件序列号搜索引擎
    javascript获取url以及jquery获取url参数的方法
    TrueCrypt 一款免费开源的加密软件
    nuit中文文档
    FineUploader 结合 一般处理程序 【上传示例】
    新浪CDN加速类库.
    C#整合VS2010和NUnit
    zencoding更名emmet了.
    visual studio 主题下载网站
    win8无法使用内置管理员账户打开 解决办法
  • 原文地址:https://www.cnblogs.com/liuyitan/p/11660848.html
Copyright © 2011-2022 走看看