GE_OG_CALC_COLUMN_EMPTY

CREATE OR REPLACE PROCEDURE CUST_MKT_DWH.GE_OG_CALC_COLUMN_EMPTY(P_TABLE_NAME IN VARCHAR2) IS
    --TYPE  
    TYPE Type_Column_Name IS RECORD(
        TABLE_NAME  ALL_TAB_COLS.TABLE_NAME%TYPE,
        COLUMN_NAME ALL_TAB_COLS.COLUMN_NAME%TYPE
    );
    TYPE XX               IS TABLE OF Type_Column_Name;
    TYPE Type_CalcSet     IS TABLE OF CUST_MKT_DWH.GE_OG_MKT_CALC_COLUMN_EMPTY%ROWTYPE;
    --Variable of Normal
    V_Column_Name         XX;
    CalcSet               Type_CalcSet := Type_CalcSet();
    V_Empty_Column        NUMBER(8);
    V_Not_Empty_Column    NUMBER(8);
    V_Sql                 VARCHAR2(32767);
    --Variable of EXCEPTION
    DML_EXCEPTION         EXCEPTION;
    PRAGMA EXCEPTION_INIT(DML_EXCEPTION,-24381);
BEGIN
    --First,search data and calc number to insert into CalcSet
    SELECT TABLE_NAME,COLUMN_NAME BULK COLLECT INTO V_Column_Name
    FROM ALL_TAB_COLS
    WHERE TABLE_NAME IN(SELECT TABLE_NAME
                        FROM ALL_TABLES
                        WHERE OWNER = 'CUST_MKT_DWH'
                        AND TABLE_NAME LIKE P_TABLE_NAME);
    
    --EXECUTE IMMEDIATE V_Sql;         
    FOR i IN V_Column_Name.FIRST .. V_Column_Name.LAST LOOP
        V_Sql := 'SELECT COUNT('||V_Column_Name(i).column_name||'),COUNT(*)-COUNT('||V_Column_Name(i).column_name||')
                 FROM '||V_Column_Name(i).table_name; 
        BEGIN   
            EXECUTE IMMEDIATE V_Sql INTO V_Not_Empty_Column,V_Empty_Column;
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('Execute query count sql script exception');
                CONTINUE;
        END;
        IF V_Not_Empty_Column=0 THEN
            CalcSet.EXTEND;
            CalcSet(CalcSet.LAST).TABLE_NAME    := V_Column_Name(i).table_name;
            CalcSet(CalcSet.LAST).COLUMN_NAME   := V_Column_Name(i).column_name;
            CalcSet(CalcSet.LAST).NOT_EMPTY_NUM := V_Not_Empty_Column;
            CalcSet(CalcSet.LAST).EMPTY_NUM     := V_Empty_Column;
        END IF;
    END LOOP;
    --Second,insert into table from data of CalcSet
    EXECUTE IMMEDIATE 'TRUNCATE TABLE CUST_MKT_DWH.GE_OG_MKT_CALC_COLUMN_EMPTY';
    BEGIN
        FORALL i IN CalcSet.FIRST .. CalcSet.LAST SAVE EXCEPTIONS
            INSERT INTO CUST_MKT_DWH.GE_OG_MKT_CALC_COLUMN_EMPTY(TABLE_NAME,COLUMN_NAME,NOT_EMPTY_NUM,EMPTY_NUM,CREATE_TIME)
                   VALUES(CalcSet(i).TABLE_NAME,CalcSet(i).COLUMN_NAME,CalcSet(i).Not_Empty_NUM,CalcSet(i).Empty_NUM,CURRENT_DATE);
            COMMIT;  
    EXCEPTION
        WHEN DML_EXCEPTION THEN
            ROLLBACK;
            DBMS_OUTPUT.PUT_LINE('DML exception');
            RAISE;
        WHEN OTHERS THEN
            ROLLBACK;
            DBMS_OUTPUT.PUT_LINE('Forall insert others exception');
            RAISE;
    END;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Global others exception');
        RAISE;
END;

  

posted @ 2016-03-30 16:58  JeromeZ  阅读(302)  评论(0编辑  收藏  举报