diff

博客园 首页 新随笔 联系 订阅 管理

--Project:SCM项目二期-----------------------------------------------------------------------------------
--Author:is-null@sohu.com-------------------------------------------------------------------------------
--Version:5.0-------------------------------------------------------------------------------------------
--Created Date:2002-12-10-------------------------------------------------------------------------------
--Last Modified:2004-04-26------------------------------------------------------------------------------
--Desc:ORACLE数据库开发工具库-----------------------------------------------------------------------------
--Document:ORACLE数据库开发工具库.DOC---------------------------------------------------------------------
*******************************************************************************************************/

/*******************************************************************************************************
----ID001,V1.0 [2002-12-10]:/Complete The Package Head And Package Body/----
----ID002,V2.0 [2003-01-02]:/增加表之间数据比较函数table_comp/----
----ID003,V2.1 [2003-01-02]:/完善修改,部分过程的日志处理等。/----
----ID004,V3.0 [2003-01-09]:/增加IDB LOADER的配置初始化过程:Init_Ldr_Cons/----
----ID005,V3.1 [2003-02-27]:/增加Del_Log和Cls_Log过程/----
----ID006,V4.0 [2003-04-04]:/改进Table_Comp地执行输出/----
----ID007,V4.1 [2003-04-06]:/增加清除IDB目标表的操作,CL_OBJ_TAB:TRUNCATE所有的目标表/----
                      /CL_OBJ_TAB2:取得用户订制脚本,执行清除目标表的数据/----
----ID008,V4.2 [2003-04-21]:/增加Table_Comp2,用于根据IDB字典表,比较表之间的数据差异/----
----ID009,V4.4 [2003-04-21PM]:/增加Init_Ldr_Cons得重载函数,用于更新相应任务的MD_Cfg_FK_Cons/----
----ID010,V4.5 [2003-04-23PM]:/增加Exp_Reset函数,用于IDB运行异常时的配置状态表的状态恢复/----
----ID011,V4.6 [2003-05-16]:/增加CL_OBJ_TAB的重载函数,用于处理任务ID/----
----ID012,V4.7 [2003-05-16PM]:/增加CL_OBJ_TAB的重载函数(不带返回参数),用于处理任务ID/----
----ID013,V4.8 [2003-05-18PM]:/增加IDB运行出错后,重新运行的时候,系统初始化函数/----
----ID014,V4.9 [2003-05-21]:/优化一下Init_Ldr_Cons的性能/----
----ID015,V5.0 [2004-04-26]:/全面升级,进行通用化处理/----

*******************************************************************************************************/

CREATE OR REPLACE PACKAGE Orcl_Tool AS
  FUNCTION Comp_Tab_Lvl(iv_CTable VARCHAR2) RETURN NUMBER;
  FUNCTION Get_PTable(iv_CTable VARCHAR2,iv_Cons_Name VARCHAR2) RETURN VARCHAR2;
  PROCEDURE Get_Parent_Tab_FK(iv_CTable VARCHAR2);
  PROCEDURE Get_Child_Tab_FK(iv_PTable VARCHAR2);
  PROCEDURE Create_UI_Trigger(on_ExitCode OUT NUMBER);
  PROCEDURE Upt_Logic_Related_TBs(iv_IDB_User VARCHAR2,iv_ADW_User VARCHAR2);
  PROCEDURE Table_Comp(iv_Src_Owner VARCHAR2,iv_Dest_Owner VARCHAR2,iv_Dest_DBLink VARCHAR2,iv_Range VARCHAR2,iv_PKAble BOOLEAN,iv_Comp_Mode VARCHAR2);
  PROCEDURE Table_Comp2(iv_Src_Owner VARCHAR2,iv_Dest_Owner VARCHAR2,iv_Dest_DBLink VARCHAR2,iv_Tab_Type VARCHAR2,iv_PKAble BOOLEAN,iv_Comp_Mode VARCHAR2);
  PROCEDURE Del_Log(Module_Name VARCHAR2,End_Dttm DATE,Start_Dttm DATE DEFAULT TO_DATE('2000-01-01','YYYY-MM-DD'));
  PROCEDURE Cls_Log(Module_Name VARCHAR2);
  FUNCTION Get_Task_CL_Text(iv_Task_Name VARCHAR2,iv_CL_Text VARCHAR2) RETURN VARCHAR2;
  PROCEDURE CL_Obj_Tab;
  PROCEDURE CL_Obj_Tab(on_ExitCode OUT NUMBER);
  PROCEDURE CL_Obj_Tab(on_ExitCode OUT NUMBER,iv_Task_Name VARCHAR2,iv_CL_Mode VARCHAR2 DEFAULT NULL);
  PROCEDURE CL_Obj_Tab(on_ExitCode OUT NUMBER,in_Task_ID NUMBER,iv_CL_Mode VARCHAR2 DEFAULT NULL);
  PROCEDURE CL_Obj_Tab(in_Task_ID NUMBER,iv_CL_Mode VARCHAR2 DEFAULT NULL);
  PROCEDURE Exp_Reset;
  PROCEDURE IDB_Rerun_Init;

  --PROCEDURE DB_To_Text();
  -----------------------------------------------------------------------------------------------------------------------------------
  gv_User VARCHAR2(30);
  gv_Module_Name VARCHAR2(30) :='ORCL_TOOL';
  C_VERSION CONSTANT VARCHAR2(18) :='5.0.015.20040426';
  C_AUTHOR CONSTANT VARCHAR2(80) :='jiangbing@lenovo.com';
  C_DESCR CONSTANT VARCHAR2(200) :='ORACLE数据库开发工具库';

END Orcl_Tool;
/
CREATE OR REPLACE PACKAGE BODY Orcl_Tool
AS
 
    FUNCTION Comp_Tab_Lvl(iv_CTable VARCHAR2) RETURN NUMBER
    AS
    n_PTables NUMBER;
    n_YLevel NUMBER;
    TYPE t_YLevels_Array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
    t_YLevels t_YLevels_Array;
    n_PTables_ID NUMBER :=0;
    n_Max_YLevel NUMBER;
   
    BEGIN
    SELECT COUNT(*) INTO n_PTables FROM MD_CFG_FK_Cons WHERE CTable=iv_CTable AND PTable IN (SELECT CTable FROM MD_CFG_FK_CONS);
    IF n_PTables =0 THEN
      RETURN 0;
    ELSE
      FOR C IN (SELECT * FROM MD_CFG_FK_CONS WHERE CTable=iv_CTable AND PTable IN (SELECT CTable FROM MD_CFG_FK_CONS) ) LOOP
        n_PTables_ID :=n_PTables_ID+1;
     
 
        n_YLevel :=Comp_Tab_Lvl(C.PTable)+1;
        --t_YLevels_Array.Extend;
    --    dbms_output.put_line(n_PTables_id);
    --    dbms_output.put_line('111');
        t_YLevels(n_PTables_ID) :=n_YLevel;
 
 
 
      END LOOP;
    DBMS_OUTPUT.PUT_LINE(IV_CTable);
      FOR CC IN 1..T_YLEVELS.COUNT LOOP
        IF CC=1 THEN
          n_Max_YLevel :=T_YLEVELS(CC);
        ELSE
          IF T_YLEVELS(CC)>n_Max_YLevel THEN
            n_Max_YLevel :=T_YLEVELS(CC);
          END IF;
        END IF;
        DBMS_OUTPUT.PUT_LINE(T_YLEVELS(CC));
      END LOOP;
      RETURN n_Max_YLevel;
    END IF;
  END Comp_Tab_Lvl;


/****************************************************************************************
--TOOL2
--
****************************************************************************************/
  FUNCTION Get_PTable(iv_CTable VARCHAR2,iv_Cons_Name VARCHAR2) RETURN VARCHAR2
  IS
    v_PTable VARCHAR2(30);
  BEGIN
    SELECT Table_Name INTO v_PTable
      FROM DBA_Constraints
      WHERE Constraint_Type='P'
      AND OWNER=gv_ADW_User
      AND Constraint_Name=iv_Cons_Name;
    RETURN v_PTable; 
  END;

  PROCEDURE Get_Parent_Tab_FK(iv_CTable VARCHAR2)
  IS
  BEGIN
    INSERT INTO MD_CFG_FK_CONS
      SELECT 'IDBTOADW',Table_Name,
        Table_Name||'_E',
        Get_PTable(iv_CTable,R_Constraint_Name) R_Table,
        Constraint_Name,
        9999
      FROM DBA_Constraints C1 WHERE Constraint_Type='R'
      AND OWNER=gv_ADW_User AND Table_Name=iv_CTable
      AND Constraint_Name NOT IN (SELECT FK_Name FROM MD_CFG_FK_CONS);
    COMMIT;


  END Get_Parent_Tab_FK;

/****************************************************************************************
--TOOL2
--
****************************************************************************************/
  PROCEDURE Get_Child_Tab_FK(iv_PTable VARCHAR2)
  IS
  BEGIN
    INSERT INTO MD_CFG_FK_CONS
      SELECT 'IDBTOADW',Table_Name,NULL,iv_PTable,Constraint_NAME,9999
      FROM DBA_Constraints
      WHERE Constraint_Type='R'
      AND OWNER=gv_ADW_User
      AND R_Constraint_Name IN
      (SELECT Constraint_NAME FROM DBA_Constraints WHERE Table_Name=iv_PTable
      AND OWNER=gv_ADW_User
      AND Constraint_Type='P')
      AND Constraint_Name NOT IN (SELECT FK_Name FROM MD_CFG_FK_CONS);
    COMMIT;


  END Get_Child_Tab_FK;


  /************************************************************************************************************
  用于建立MD_CFG_CALENDAR表的触发器,用户可以自己定义,这个触发器功能就是要在用户增加新的与时间有关的RESOURCE
  的时候给UI表增加原始数据,用于给与用户维护RESOURCE与日历的关系。
  ************************************************************************************************************/
  PROCEDURE Create_UI_Trigger(on_ExitCode OUT NUMBER)
  IS
    err_num NUMBER;
    err_msg VARCHAR2(512);
    v_stmt VARCHAR2(10000) :='NULL';
    v_columnstr     VARCHAR2(2000) ;
    v_columnstr_old VARCHAR2(2000) ;
    v_columnstr_new VARCHAR2(2000) ;
    v_table_name VARCHAR2(30):='NULL';
    v_ltable_name VARCHAR2(30) :='NULL';
    v_ltrigger_name VARCHAR2(30) :='NULL';
    v_Logic_Proc_Name VARCHAR2(30) :='Create_UI_Trigger';
    v_Data_Source VARCHAR2(512);
    v_Data_Dest VARCHAR2(512);
    v_ErrDesc VARCHAR2(4000) :='Create_UI_Trigger Exception: ';

  BEGIN
    on_ExitCode :=-20099;
    FOR table_rec IN (SELECT * FROM MD_Cfg_UILogTrigger) LOOP
 
    BEGIN
  --auto generate the table column data
      v_columnstr := NULL;
      v_columnstr_old := NULL;
      v_columnstr_new := NULL;
      FOR v_rec IN( SELECT table_name, column_name FROM user_tab_columns
                   WHERE table_name = table_rec.table_name)
      LOOP
        v_columnstr := v_columnstr || ',' || v_rec.column_name;
        v_columnstr_old := v_columnstr_old || ',:OLD.' || v_rec.column_name;
        v_columnstr_new := v_columnstr_new || ',:NEW.' || v_rec.column_name;
      END LOOP;
      v_ErrDesc :='Create_UI_Trigger Exception: ';
      v_columnstr := LTRIM (v_columnstr, ',');
      v_columnstr_old := LTRIM (v_columnstr_old, ',');
      v_columnstr_new := LTRIM (v_columnstr_new, ',');
      v_table_name := table_rec.table_name;
      v_ltable_name := table_rec.ltable_name;
      v_ltrigger_name := table_rec.ltrigger_name;
 
      v_stmt :=' CREATE OR REPLACE TRIGGER '||v_ltrigger_name;
      v_stmt := v_stmt||' AFTER INSERT OR UPDATE OR DELETE ON '||v_table_name ||' FOR EACH ROW';
      v_stmt := v_stmt||' /** AUTHOR: yangbt@legend.com  DESCR:auto generated by IDB_Base_Tools.Create_UI_Trigger(on_ExitCode OUT NUMBER) procedure **/ ';
      v_stmt := v_stmt||' BEGIN ';
      v_stmt := v_stmt||' IF INSERTING THEN ';
      v_stmt := v_stmt||' INSERT INTO '||v_ltable_name||'('||v_columnstr||',logtime,logtype,loguser,loguiuser,logterminal,logdelflag) VALUES('||v_columnstr_new||',SYSDATE,''I'',USER,SUBSTRB(USERENV(''CLIENT_INFO''),1,64),SUBSTRB(USERENV(''TERMINAL''),1,64),''0''); ';
      v_stmt := v_stmt||' ELSIF UPDATING THEN ';
      v_stmt := v_stmt||' INSERT INTO '||v_ltable_name||'('||v_columnstr||',logtime,logtype,loguser,loguiuser,logterminal,logdelflag) VALUES('||v_columnstr_old||',SYSDATE,''B'',USER,SUBSTRB(USERENV(''CLIENT_INFO''),1,64),SUBSTRB(USERENV(''TERMINAL''),1,64),''0''); ';
      v_stmt := v_stmt||' INSERT INTO '||v_ltable_name||'('||v_columnstr||',logtime,logtype,loguser,loguiuser,logterminal,logdelflag) VALUES('||v_columnstr_new||',SYSDATE,''A'',USER,SUBSTRB(USERENV(''CLIENT_INFO''),1,64),SUBSTRB(USERENV(''TERMINAL''),1,64),''0''); ';
      v_stmt := v_stmt||' ELSIF DELETING THEN ';
      v_stmt := v_stmt||' INSERT INTO '||v_ltable_name||'('||v_columnstr||',logtime,logtype,loguser,loguiuser,logterminal,logdelflag) VALUES('||v_columnstr_old||',SYSDATE,''D'',USER,SUBSTRB(USERENV(''CLIENT_INFO''),1,64),SUBSTRB(USERENV(''TERMINAL''),1,64),''0''); ';
      v_stmt := v_stmt||' END IF; ';
      v_stmt := v_stmt||'  END '||v_ltrigger_name||';';
      EXECUTE IMMEDIATE v_stmt;
    EXCEPTION
      WHEN OTHERS THEN
        err_msg :=SUBSTR(SQLERRM,1,512);
        v_ErrDesc :=SUBSTR(v_ErrDesc||'{'||v_stmt||'}',1,4000);
        IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,err_msg,'E',v_Data_Source,v_Data_Dest,v_ErrDesc,'MD_LOG_BASEFUNCS');
        COMMIT;

    END;
    END LOOP;
    on_ExitCode :=0;
  EXCEPTION
    WHEN OTHERS THEN
      on_ExitCode :=SQLCODE;
      v_ErrDesc :=SUBSTR(v_ErrDesc||'{'||v_stmt||'}',1,4000);
      IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,SUBSTR(SQLERRM,1,512),'E',v_Data_Source,v_Data_Dest,v_ErrDesc);
      COMMIT;


  END Create_UI_Trigger;


  /************************************************************************************************************
  用于建立MD_CFG_CALENDAR表的触发器,用户可以自己定义,这个触发器功能就是要在用户增加新的与时间有关的RESOURCE
  的时候给UI表增加原始数据,用于给与用户维护RESOURCE与日历的关系。
  ************************************************************************************************************/
 
  /************************************************************************************
  CREATE OR REPLACE TRIGGER ADW2_MD_USER.MT_CFG_CALENDAR
  BEFORE INSERT OR DELETE
  ON ADW2_MD_USER.MD_CFG_CALENDAR
  FOR EACH ROW
  Declare
    n_Cnt Number :=0;
    n_Days NUMBER :=0;
    v_BU  MD_CFG_CALENDAR.BU%TYPE;
    v_Facility_Name MD_CFG_CALENDAR.Facility_Name%TYPE;
    v_Capacity_Pat MD_CFG_CALENDAR.Capacity_Pat%TYPE;
 
  Begin
    IF INSERTING THEN
      SELECT COUNT(*) INTO n_Cnt FROM MD_CFG_CALENDAR
        WHERE BU = :new.BU
        AND Facility_Name = :new.Facility_Name
        AND Capacity_Pat = :new.Capacity_Pat;
 
      IF n_Cnt IS NULL OR n_Cnt=0 THEN
        n_Days :=TO_DATE('2031-12-31','YYYY-MM-DD') - TRUNC(SYSDATE,'DD');
        FOR n_Loop IN 0..n_Days LOOP
          INSERT INTO MD_UI_Calendar_Capacity
            VALUES(:new.BU,
                   :new.Facility_Name,
                   TRUNC(SYSDATE,'DD')+n_Loop,
                   :new.Capacity_Pat,
                   1);
 
        END LOOP;
 
      END IF;
    END IF;
  END;

  ************************************************************************************/
 
  /************************************************************************************************************
  用于更新逻辑使用的相关的表,这里运行一次全部更新,对于引用一些系统表,如DUAL,DBA_TABLES等不会做作为相关表更新的
  主要用于针对更新IDB系统的逻辑相关表,所以需要指定IDB系统的IDB_USER和ADW_USER。
  ************************************************************************************************************/
  PROCEDURE Upt_Logic_Related_TBs(iv_IDB_User VARCHAR2,iv_ADW_User VARCHAR2)
  IS
    RELATE_TBS VARCHAR2(2024);
  BEGIN
    FOR CC IN(SELECT * FROM MD_IDB_CTRL) LOOP
    RELATE_TBS :='';
    FOR C IN (SELECT * FROM DBA_DEPENDENCIES WHERE NAME=CC.IDB_LOGIC_NAME AND (OWNER=iv_IDB_User  OR OWNER=iv_ADW_User)
    AND REFERENCED_TYPE='TABLE') LOOP
      IF C.REFERENCED_NAME<>'DUAL' THEN
        RELATE_TBS :=RELATE_TBS||','||C.REFERENCED_NAME;
      END IF;
    END LOOP;
    IF CC.IDB_LOGIC_NAME='IDB_FACILITY_ITEM' THEN
    DBMS_OUTPUT.PUT_LINE(CC.IDB_LOGIC_NAME);
   
    DBMS_OUTPUT.PUT_LINE(substr(RELATE_TBS,1,255));
   
    END IF;
   
    UPDATE MD_IDB_CTRL SET RELATED_TABLES=SUBSTR(RELATE_TBS,2) WHERE IDB_LOGIC_NAME=CC.IDB_LOGIC_NAME;
   
    END LOOP;
    COMMIT;
    RELATE_TBS :=SUBSTR(RELATE_TBS,2);
   
   
  END Upt_Logic_Related_TBs;
 
  /************************************************************************************************************
  用于比较两个表的内容的差异,这两个表的表名称必须一致,结构必须一致,必须有主键,数据比较是基于主键数据的比较或者
  基于所有列的数据,若iv_PKAble=TRUE那么是基于主键的比较,否则是基于所有列的数据比较需要的参数有对比的源数据的OWNER
  和对比的目标OWNER和目标DBLINK(可以为空),
  -------------------------------------------
  运行之前要在{IDB_USER}下面建立如下的表:(用后注意删除)
  drop table idb$table_comp;

  CREATE TABLE IDB$TABLE_COMP (
  TABLE_NAME  VARCHAR2(30),
  COMP_SQL    VARCHAR2(4000),
  COMP_SQL2 VARCHAR2(4000));
  ************************************************************************************************************/
  PROCEDURE Table_Comp(iv_Src_Owner VARCHAR2,iv_Dest_Owner VARCHAR2,iv_Dest_DBLink VARCHAR2,iv_Range VARCHAR2,iv_PKAble BOOLEAN,iv_Comp_Mode VARCHAR2)
  IS
    v_Comp_Cols VARCHAR2(320);
    v_Comp_SQL VARCHAR2(4000);
    v_Comp_SQL2 VARCHAR2(4000);
    n_Loop NUMBER;
    n_Cnt INT;

    v_Range VARCHAR2(60);
 
  BEGIN 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE IDB$TABLE_COMP';

    v_Range :=iv_Range||'%';
    FOR CR IN (SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER=iv_Src_Owner AND Table_Name LIKE v_Range) LOOP
    BEGIN
      v_Comp_Cols :='';
      --DBMS_OUTPUT.PUT_LINE(CR.TABLE_NAME);
      n_Loop :=0;
      IF iv_PKAble=TRUE THEN
        FOR CR2 IN (SELECT COLUMN_NAME FROM
                                       DBA_CONS_COLUMNS CC,DBA_CONSTRAINTS C
           WHERE CC.CONSTRAINT_NAME=C.CONSTRAINT_NAME AND CC.OWNER=C.OWNER AND C.CONSTRAINT_TYPE='P' AND C.OWNER= iv_Src_Owner AND C.TABLE_NAME=CR.TABLE_NAME ) LOOP
          n_Loop :=n_Loop+1;
          IF n_Loop=1 THEN
            v_Comp_Cols :=CR2.COLUMN_NAME;
          ELSE
            v_Comp_Cols :=v_Comp_Cols||','||CR2.COLUMN_NAME;
          END IF;
   
   
   
        END LOOP;
      ELSE
        FOR CR3 IN (SELECT COLUMN_NAME FROM
                                       DBA_TAB_COLUMNS TC,DBA_TABLES T
           WHERE TC.TABLE_NAME=T.TABLE_NAME AND TC.OWNER=T.OWNER AND T.OWNER= iv_Src_Owner AND T.TABLE_NAME=CR.TABLE_NAME ) LOOP
          n_Loop :=n_Loop+1;
          IF n_Loop=1 THEN
            v_Comp_Cols :=CR3.COLUMN_NAME;
          ELSE
            v_Comp_Cols :=v_Comp_Cols||','||CR3.COLUMN_NAME;
          END IF;
   
   
   
        END LOOP;     
       
      END IF;
      IF v_Comp_Cols IS NULL THEN
        DBMS_OUTPUT.PUT_LINE(CR.TABLE_NAME||'IS NO PK');
       
      ELSE
 
        v_Comp_SQL :='SELECT COUNT(*) FROM '||iv_Src_Owner||'.'||CR.TABLE_NAME ||' WHERE ('||v_Comp_Cols||') NOT IN (SELECT '||v_Comp_Cols||' FROM '||iv_Dest_Owner ||'.'|| CR.TABLE_NAME || '@' ||iv_Dest_DBLink||');';
        v_Comp_SQL2 :='SELECT COUNT(*) FROM '||iv_Dest_Owner||'.'||CR.TABLE_NAME ||'@'||iv_Dest_DBLink||' WHERE ('||v_Comp_Cols||') NOT IN (SELECT '||v_Comp_Cols||' FROM '||iv_Src_Owner ||'.'|| CR.TABLE_NAME ||');';
        IF UPPER(iv_Comp_Mode) ='SYSTEM' THEN
          EXECUTE IMMEDIATE 'INSERT INTO IDB$TABLE_COMP VALUES('''||CR.TABLE_NAME||''','''||V_COMP_SQL||''','''||v_Comp_SQL2||''')';
        ELSE

          EXECUTE IMMEDIATE RTRIM(v_Comp_SQL,';') INTO n_Cnt;
          IF n_Cnt>0 THEN
            DBMS_OUTPUT.PUT_LINE(CR.TABLE_NAME||'IS NOT SAME');
          END IF;
        END IF;
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('THE SQL IS ERROR');
    END;
    END LOOP;
    COMMIT;

 
 
  END Table_Comp;
  /************************************************************************************************************
  根据IDB字典表MD_IDB_Objects来比较两个表的内容的差异,这两个表的表名称必须一致,结构必须一致,必须有主键,数据比较是基于主键数据的比较或者
  基于所有列的数据,若iv_PKAble=TRUE那么是基于主键的比较,否则是基于所有列的数据比较需要的参数有对比的源数据的OWNER
  和对比的目标OWNER和目标DBLINK(可以为空),
  -------------------------------------------
  运行之前要在{IDB_USER}下面建立如下的表:(用后注意删除)
  drop table idb$table_comp;

  CREATE TABLE IDB$TABLE_COMP (
  TABLE_NAME  VARCHAR2(30),
  COMP_SQL    VARCHAR2(4000),
  COMP_SQL2 VARCHAR2(4000));
  ************************************************************************************************************/
  PROCEDURE Table_Comp2(iv_Src_Owner VARCHAR2,iv_Dest_Owner VARCHAR2,iv_Dest_DBLink VARCHAR2,iv_Tab_Type VARCHAR2,iv_PKAble BOOLEAN,iv_Comp_Mode VARCHAR2)
  IS
    v_Comp_Cols VARCHAR2(320);
    v_Comp_SQL VARCHAR2(4000);
    v_Comp_SQL2 VARCHAR2(4000);
    n_Loop NUMBER;
    n_Cnt INT;

    v_Range VARCHAR2(60);
 
  BEGIN 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE IDB$TABLE_COMP';

    v_Range :=iv_Tab_Type||'%';
    FOR CR IN (SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER=iv_Src_Owner AND Table_Name IN (SELECT Object_Name FROM MD_IDB_Objects WHERE Object_Type LIKE v_Range)) LOOP
    BEGIN
      v_Comp_Cols :='';
      --DBMS_OUTPUT.PUT_LINE(CR.TABLE_NAME);
      n_Loop :=0;
      IF iv_PKAble=TRUE THEN
        FOR CR2 IN (SELECT COLUMN_NAME FROM
                                       DBA_CONS_COLUMNS CC,DBA_CONSTRAINTS C
           WHERE CC.CONSTRAINT_NAME=C.CONSTRAINT_NAME AND CC.OWNER=C.OWNER AND C.CONSTRAINT_TYPE='P' AND C.OWNER= iv_Src_Owner AND C.TABLE_NAME=CR.TABLE_NAME ) LOOP
          n_Loop :=n_Loop+1;
          IF n_Loop=1 THEN
            v_Comp_Cols :=CR2.COLUMN_NAME;
          ELSE
            v_Comp_Cols :=v_Comp_Cols||','||CR2.COLUMN_NAME;
          END IF;
   
   
   
        END LOOP;
      ELSE
        FOR CR3 IN (SELECT COLUMN_NAME FROM
                                       DBA_TAB_COLUMNS TC,DBA_TABLES T
           WHERE TC.TABLE_NAME=T.TABLE_NAME AND TC.OWNER=T.OWNER AND T.OWNER= iv_Src_Owner AND T.TABLE_NAME=CR.TABLE_NAME ) LOOP
          n_Loop :=n_Loop+1;
          IF n_Loop=1 THEN
            v_Comp_Cols :=CR3.COLUMN_NAME;
          ELSE
            v_Comp_Cols :=v_Comp_Cols||','||CR3.COLUMN_NAME;
          END IF;
   
   
   
        END LOOP;     
       
      END IF;
      IF v_Comp_Cols IS NULL THEN
        DBMS_OUTPUT.PUT_LINE(CR.TABLE_NAME||'IS NO PK');
       
      ELSE
 
        v_Comp_SQL :='SELECT COUNT(*) FROM '||iv_Src_Owner||'.'||CR.TABLE_NAME ||' WHERE ('||v_Comp_Cols||') NOT IN (SELECT '||v_Comp_Cols||' FROM '||iv_Dest_Owner ||'.'|| CR.TABLE_NAME || '@' ||iv_Dest_DBLink||');';
        v_Comp_SQL2 :='SELECT COUNT(*) FROM '||iv_Dest_Owner||'.'||CR.TABLE_NAME ||'@'||iv_Dest_DBLink||' WHERE ('||v_Comp_Cols||') NOT IN (SELECT '||v_Comp_Cols||' FROM '||iv_Src_Owner ||'.'|| CR.TABLE_NAME ||');';
        IF UPPER(iv_Comp_Mode) ='SYSTEM' THEN
          EXECUTE IMMEDIATE 'INSERT INTO IDB$TABLE_COMP VALUES('''||CR.TABLE_NAME||''','''||V_COMP_SQL||''','''||v_Comp_SQL2||''')';
        ELSE

          EXECUTE IMMEDIATE RTRIM(v_Comp_SQL,';') INTO n_Cnt;
          IF n_Cnt>0 THEN
            DBMS_OUTPUT.PUT_LINE(CR.TABLE_NAME||'IS NOT SAME');
          END IF;
        END IF;
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('THE SQL IS ERROR');
    END;
    END LOOP;
    COMMIT;

  END Table_Comp2;

  PROCEDURE Del_Log(Module_Name VARCHAR2,End_Dttm DATE,Start_Dttm DATE DEFAULT TO_DATE('2000-01-01','YYYY-MM-DD'))
  IS
  BEGIN
    IF UPPER(Module_Name)='PONINV' THEN
      DELETE FROM MD_Log_POnInv WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;

    ELSIF UPPER(Module_Name)='BOM' THEN
      DELETE FROM MD_Log_Bom WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;

    ELSIF UPPER(Module_Name)='DF' THEN
      DELETE FROM MD_Log_DF WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;

    ELSIF UPPER(Module_Name)='DEMAND' THEN
      DELETE FROM MD_Log_Demand WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;

    ELSIF UPPER(Module_Name)='DP' THEN
      NULL;--DELETE FROM MD_Log_DP WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;

    ELSIF UPPER(Module_Name)='TOADW' THEN
      DELETE FROM MD_Log_ToADW WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;

    ELSIF UPPER(Module_Name)='BASEFUNCS' THEN
      DELETE FROM MD_Log_BaseFuncs WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;

    ELSIF UPPER(Module_Name)='ADP' THEN
      DELETE FROM MD_Log_ADP WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;
   ELSIF UPPER(Module_Name)='IDB_ALL_RUN' THEN
      DELETE FROM MD_Log_Run;
 
    ELSE
      DELETE FROM MD_Log WHERE EventTime BETWEEN Start_Dttm AND End_Dttm;
    END IF;
    COMMIT;

  END Del_Log;

  PROCEDURE Cls_Log(Module_Name VARCHAR2)
  IS
    v_Cls_SQL IDB_Base_Type.tSQL;
    nExitCode NUMBER;
  BEGIN

    IF UPPER(Module_Name)='PONINV' THEN
      v_Cls_SQL :='MD_Log_POnInv';

    ELSIF UPPER(Module_Name)='BOM' THEN
      v_Cls_SQL :='MD_Log_Bom';

    ELSIF UPPER(Module_Name)='DF' THEN
      v_Cls_SQL :='MD_Log_DF';

    ELSIF UPPER(Module_Name)='DEMAND' THEN
      v_Cls_SQL :='MD_Log_Demand';

    ELSIF UPPER(Module_Name)='DP' THEN
      v_Cls_SQL :='MD_Log_DP';

    ELSIF UPPER(Module_Name)='TOADW' THEN
      v_Cls_SQL :='MD_Log_ToADW';

    ELSIF UPPER(Module_Name)='BASEFUNCS' THEN
      v_Cls_SQL :='MD_Log_BaseFuncs';

    ELSIF UPPER(Module_Name)='ADP' THEN
      v_Cls_SQL :='MD_Log_ADP';
   ELSIF UPPER(Module_Name)='IDB_ALL_RUN' THEN
      v_Cls_SQL :='MD_Log_Run';
 
    ELSE
      v_Cls_SQL :='MD_Log';
    END IF;
    v_Cls_SQL :='TRUNCATE TABLE '||v_Cls_SQL;
    IDB_Base_Funcs.Truncate_Table(nExitCode,v_Cls_SQL);


  END Cls_Log;

  FUNCTION Get_Task_CL_Text(iv_Task_Name VARCHAR2,iv_CL_Text VARCHAR2) RETURN VARCHAR2
  IS
    v_Task_CL_Text VARCHAR2(2000);
    v_CL_Text_Part VARCHAR2(2000);
 
    v_Find_Task_Name VARCHAR2(40);
 
 
    v_Left_Sep VARCHAR2(12) :='{';
    v_Right_Sep VARCHAR2(12) :='}';
    v_Indicator VARCHAR2(12) :=':';
 
    n_Find_Pos NUMBER;
    n_Left_Sep_Pos NUMBER;
    n_Right_Sep_Pos NUMBER;
    n_Ind_Pos NUMBER;
 
  BEGIN
    v_Find_Task_Name :='['||iv_Task_Name||']';
 
    n_Find_Pos :=INSTR(iv_CL_Text,v_Find_Task_Name);
    IF n_Find_Pos=0 THEN
      RETURN v_Task_CL_Text;
    END IF;
 
    IF n_Find_Pos>0 THEN
      n_Left_Sep_Pos :=INSTR(iv_CL_Text,v_Left_Sep,n_Find_Pos);
      n_Right_Sep_Pos :=INSTR(iv_CL_Text,v_Right_Sep,n_Find_Pos);
 
      IF (n_Left_Sep_Pos>n_Right_Sep_Pos AND n_Right_Sep_Pos>0) OR (n_Left_Sep_Pos=0 AND n_Right_Sep_Pos>0) THEN
        v_CL_Text_Part :=SUBSTR(iv_CL_Text,n_Find_Pos,n_Right_Sep_Pos - n_Find_Pos);
      ELSE
        IF n_Left_Sep_Pos>0 THEN
          v_CL_Text_Part :=SUBSTR(iv_CL_Text,n_Find_Pos,n_Left_Sep_Pos - n_Find_Pos);
        ELSE
          v_CL_Text_Part :=SUBSTR(iv_CL_Text,n_Find_Pos);
        END IF;
      END IF;
 
 
      n_Ind_Pos :=INSTR(v_CL_Text_Part,':');
  --    dbms_output.put_line('mh:'||to_char(n_Ind_Pos));
      IF n_Ind_Pos>0  THEN
        v_Task_CL_Text :=SUBSTR(v_CL_Text_Part,n_Ind_Pos+1);
      END IF;
 
    END IF;

    RETURN v_Task_CL_Text;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END;
  


  PROCEDURE CL_Obj_Tab(on_ExitCode OUT NUMBER)
  IS
    -------------------------------------------------------------------------------------------------
    n_ExitCode NUMBER;
    v_SQLErrM VARCHAR2(512);


    v_Logic_Proc_Name VARCHAR2(30) :='CL_OBJ_TAB';
    v_Data_Source VARCHAR2(512);
    v_Data_Dest VARCHAR2(512);
    v_ErrDesc VARCHAR2(4000) :='CL_Obj_Tab(All) Exception:';

  BEGIN
    on_ExitCode :=-20099;

    /*************************************************************************************************
    --循环运行请出当前任务的公用表--
    *************************************************************************************************/  
    FOR Cr_CL_Tab IN (SELECT * FROM MD_CFG_ToADW2) LOOP
      BEGIN
        v_Data_Source :=Cr_CL_Tab.FromIDBTable;
        v_ErrDesc :='CL_Obj_Tab(ALL) Exception:';


      /*************************************************************************************************
      --清除(TRUNCATE TABLE)用户指定的IDB目标表--
      *************************************************************************************************/  
        IDB_Base_Funcs.Truncate_Table(n_ExitCode,Cr_CL_Tab.FromIDBTable);


        IF n_ExitCode<0 THEN
          v_SQLErrm :=SUBSTR (SQLERRM(n_ExitCode), 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'{Truncate IDB Object Tables Error'||'}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'W',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;
        END IF;
     
      EXCEPTION
        WHEN OTHERS THEN
          on_ExitCode :=SQLCODE;
          v_SQLErrm :=SUBSTR (SQLERRM, 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'Clear IDB Object Tables:Loop Inside:{OTHERS}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'E',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;

      END;
    END LOOP;
    on_ExitCode :=0;
  END CL_Obj_Tab;

  PROCEDURE CL_Obj_Tab
  IS
    -------------------------------------------------------------------------------------------------
    n_ExitCode NUMBER;
    v_SQLErrM VARCHAR2(512);


    v_Logic_Proc_Name VARCHAR2(30) :='CL_OBJ_TAB';
    v_Data_Source VARCHAR2(512);
    v_Data_Dest VARCHAR2(512);
    v_ErrDesc VARCHAR2(4000) :='CL_Obj_Tab(ALL,No Return Parameter) Exception:';

  BEGIN
    /*************************************************************************************************
    --循环运行请出当前任务的公用表--
    *************************************************************************************************/  
    FOR Cr_CL_Tab IN (SELECT * FROM MD_CFG_ToADW2) LOOP
      BEGIN
        v_Data_Source :=Cr_CL_Tab.FromIDBTable;
        v_ErrDesc :='CL_Obj_Tab(ALL,No Return Parameter) Exception:';


      /*************************************************************************************************
      --清除(TRUNCATE TABLE)用户指定的IDB目标表--
      *************************************************************************************************/  
        IDB_Base_Funcs.Truncate_Table(n_ExitCode,Cr_CL_Tab.FromIDBTable);


        IF n_ExitCode<0 THEN
          v_SQLErrm :=SUBSTR (SQLERRM(n_ExitCode), 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'{Truncate IDB Object Tables Error'||'}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'W',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;
        END IF;
     
      EXCEPTION
        WHEN OTHERS THEN
          v_SQLErrm :=SUBSTR (SQLERRM, 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'Clear IDB Object Tables:Loop Inside:{OTHERS}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'E',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;

      END;
    END LOOP;
  END CL_Obj_Tab;

  PROCEDURE CL_Obj_Tab(on_ExitCode OUT NUMBER,iv_Task_Name VARCHAR2,iv_CL_Mode VARCHAR2 DEFAULT NULL)
  IS
    -------------------------------------------------------------------------------------------------
    n_ExitCode NUMBER;
    v_SQLErrM VARCHAR2(512);


    v_Logic_Proc_Name VARCHAR2(30) :='CL_OBJ_TAB';
    v_Data_Source VARCHAR2(512);
    v_Data_Dest VARCHAR2(512);
    v_ErrDesc VARCHAR2(4000) :='CL_Obj_Tab(Task) Exception:';
    v_Cust_CL_Text VARCHAR2(4000);
    n_Task_ID NUMBER;

  BEGIN
    on_ExitCode :=-20099;
    SELECT Task_Deal_ID INTO n_Task_ID FROM MD_Cfg_IDB_Task WHERE Task_Name=iv_Task_Name;

    /*************************************************************************************************
    --循环运行请出当前任务的公用表--
    *************************************************************************************************/  
    FOR Cr_CL_Tab IN (SELECT * FROM MD_CFG_ToADW2 WHERE OBJ_TAB_CL IS NOT NULL AND BITAND(OBJ_TAB_CL,n_Task_ID)=n_Task_ID) LOOP
      BEGIN
        v_Data_Source :=Cr_CL_Tab.FromIDBTable;
        v_ErrDesc :='CL_Obj_Tab(Task) Exception:';
       

        IF iv_CL_Mode='X' THEN
          v_Cust_CL_Text :=IDB_Base_Funcs.Get_Task_CL_Text(iv_Task_Name,Cr_CL_Tab.Obj_Tab_CL_Text);
          IF v_Cust_CL_Text IS NOT NULL THEN
            IDB_Base_Funcs.Dynamic_Exec(n_ExitCode,v_Cust_CL_Text);
          END IF;
        ELSE

          /*************************************************************************************************
          --清除(TRUNCATE TABLE)用户指定的IDB目标表--
          *************************************************************************************************/  
          IDB_Base_Funcs.Truncate_Table(n_ExitCode,Cr_CL_Tab.FromIDBTable);
        END IF;

        IF n_ExitCode<0 THEN
          v_SQLErrm :=SUBSTR (SQLERRM(n_ExitCode), 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'{Truncate IDB Object Tables Error'||'}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'W',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;
        END IF;
     
      EXCEPTION
        WHEN OTHERS THEN
          on_ExitCode :=SQLCODE;
          v_SQLErrm :=SUBSTR (SQLERRM, 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'Clear IDB Object Tables:Loop Inside:{OTHERS}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'E',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;

      END;
    END LOOP;
    on_ExitCode :=0;
  END CL_Obj_Tab;

  PROCEDURE CL_Obj_Tab(on_ExitCode OUT NUMBER,in_Task_ID NUMBER,iv_CL_Mode VARCHAR2 DEFAULT NULL)
  IS
    -------------------------------------------------------------------------------------------------
    n_ExitCode NUMBER;
    v_SQLErrM VARCHAR2(512);


    v_Logic_Proc_Name VARCHAR2(30) :='CL_OBJ_TAB';
    v_Data_Source VARCHAR2(512);
    v_Data_Dest VARCHAR2(512);
    v_ErrDesc VARCHAR2(4000) :='CL_Obj_Tab(Task) Exception:';
    v_Cust_CL_Text VARCHAR2(4000);
    n_Task_ID NUMBER;

  BEGIN
    on_ExitCode :=-20099;
    /*************************************************************************************************
    --循环运行请出当前任务的公用表--
    *************************************************************************************************/  

    FOR Cr_CL_Tab IN (SELECT * FROM MD_CFG_ToADW2 WHERE OBJ_TAB_CL IS NOT NULL AND BITAND(OBJ_TAB_CL,in_Task_ID)>0) LOOP
      BEGIN
        v_Data_Source :=Cr_CL_Tab.FromIDBTable;
        v_ErrDesc :='CL_Obj_Tab(Task) Exception:';
       

        IF iv_CL_Mode='X' THEN
          FOR TK IN (SELECT * FROM MD_Cfg_IDB_Task WHERE BITAND(Task_Deal_ID,in_Task_ID)=in_Task_ID) LOOP
            v_Cust_CL_Text :=IDB_Base_Funcs.Get_Task_CL_Text(TK.Task_Name,Cr_CL_Tab.Obj_Tab_CL_Text);
            IF v_Cust_CL_Text IS NOT NULL THEN
              IDB_Base_Funcs.Dynamic_Exec(n_ExitCode,v_Cust_CL_Text);
            END IF;
          END LOOP;
        ELSE

          /*************************************************************************************************
          --清除(TRUNCATE TABLE)用户指定的IDB目标表--
          *************************************************************************************************/  
          IDB_Base_Funcs.Truncate_Table(n_ExitCode,Cr_CL_Tab.FromIDBTable);
        END IF;

        IF n_ExitCode<0 THEN
          v_SQLErrm :=SUBSTR (SQLERRM(n_ExitCode), 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'{Truncate IDB Object Tables Error'||'}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'W',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;
        END IF;
     
      EXCEPTION
        WHEN OTHERS THEN
          on_ExitCode :=SQLCODE;
          v_SQLErrm :=SUBSTR (SQLERRM, 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'Clear IDB Object Tables:Loop Inside:{OTHERS}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'E',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;

      END;
    END LOOP;
    on_ExitCode :=0;
  END CL_Obj_Tab;

  PROCEDURE CL_Obj_Tab(in_Task_ID NUMBER,iv_CL_Mode VARCHAR2 DEFAULT NULL)
  IS
    -------------------------------------------------------------------------------------------------
    n_ExitCode NUMBER;
    v_SQLErrM VARCHAR2(512);


    v_Logic_Proc_Name VARCHAR2(30) :='CL_OBJ_TAB';
    v_Data_Source VARCHAR2(512);
    v_Data_Dest VARCHAR2(512);
    v_ErrDesc VARCHAR2(4000) :='CL_Obj_Tab(Tasks,No Return Parameter) Exception:';
    v_Cust_CL_Text VARCHAR2(4000);
    n_Task_ID NUMBER;

  BEGIN
    /*************************************************************************************************
    --循环运行请出当前任务的公用表--
    *************************************************************************************************/  
    DBMS_OUTPUT.PUT_LINE('XP');

    FOR Cr_CL_Tab IN (SELECT * FROM MD_CFG_ToADW2 WHERE OBJ_TAB_CL IS NOT NULL AND BITAND(OBJ_TAB_CL,in_Task_ID)>0) LOOP
      BEGIN
        v_Data_Source :=Cr_CL_Tab.FromIDBTable;
        v_ErrDesc :='CL_Obj_Tab(Tasks,No Return Parameter) Exception:';
       

        IF iv_CL_Mode='X' THEN
          FOR TK IN (SELECT * FROM MD_Cfg_IDB_Task WHERE BITAND(Task_Deal_ID,in_Task_ID)=in_Task_ID) LOOP
            v_Cust_CL_Text :=IDB_Base_Funcs.Get_Task_CL_Text(TK.Task_Name,Cr_CL_Tab.Obj_Tab_CL_Text);
            IF v_Cust_CL_Text IS NOT NULL THEN
              IDB_Base_Funcs.Dynamic_Exec(n_ExitCode,v_Cust_CL_Text);
            END IF;
          END LOOP;
        ELSE

          /*************************************************************************************************
          --清除(TRUNCATE TABLE)用户指定的IDB目标表--
          *************************************************************************************************/  
          IDB_Base_Funcs.Truncate_Table(n_ExitCode,Cr_CL_Tab.FromIDBTable);
        END IF;

        IF n_ExitCode<0 THEN
          v_SQLErrm :=SUBSTR (SQLERRM(n_ExitCode), 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'{Truncate IDB Object Tables Error'||'}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'W',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;
        END IF;
     
      EXCEPTION
        WHEN OTHERS THEN
          v_SQLErrm :=SUBSTR (SQLERRM, 1, 512);
          v_ErrDesc :=SUBSTR(v_ErrDesc||'Clear IDB Object Tables:Loop Inside:{OTHERS}',1,4000);
          IDB_Base_Funcs.Insert_Log(SYSDATE,gv_IDB_User||'.'||gv_Logic_Name,v_Logic_Proc_Name,SQLCODE,v_SQLErrM,'E',v_Data_Source,v_Data_Dest,v_ErrDesc);
          COMMIT;

      END;
    END LOOP;
  END CL_Obj_Tab;

  PROCEDURE Exp_Reset
  IS
  BEGIN
    /*
    恢复EXCEPTION_LOG表的状态为0
    */
    UPDATE MD_Cfg_Exp_Log_Tab SET Engage_Status=0;

    COMMIT;
  END Exp_Reset;

  PROCEDURE IDB_Rerun_Init
  IS
  BEGIN
    UPDATE MD_Cfg_Exp_Log_Tab SET Engage_Status=0;
    UPDATE MD_Cfg_IDB_Task SET Start_Dttm=NULL,End_Dttm=NULL;
    COMMIT;
  END IDB_Rerun_Init;

END Orcl_Tool;

posted on 2005-03-29 10:03  秋水天长  阅读(103)  评论(0)    收藏  举报