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;

  

GE_OG_CALC_COLUMN_EMPTY的更多相关文章

随机推荐

  1. 面向对象程序设计-C++_课时21引用

    数据类型 & 别名=对象名; #include <iostream> using namespace std; int * f(int * x) { (*x)++; return ...

  2. js原生forEach、map与jquery的each、$.each的区别

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  3. 仅仅需手动添加一行代码就可以让Laravel4执行在SAE (v. 1.0.0)

    Github:https://github.com/chariothy/laravel4-sae (已更新至v1.1.0) laravel4-sae (v. 1.0.0) 仅仅需手动添加一行代码就可以 ...

  4. asp.net MVC Razor 语法(1)

    Razor 不是编程语言.它是服务器端标记语言. 什么是 Razor ? Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时, ...

  5. Request.ServerVariables完整参考

    Request.ServerVariables("Url") 返回服务器地址 Request.ServerVariables("Path_Info") 客户端提 ...

  6. bool operator==(const Array&)const; 这最后一个const 是做什么用的

    字符重载也是个函数,在函数末尾加CONST 这样的函数叫常成员函数.常成员函数可以理解为是一个“只读”函数,它既不能更改数据成员的值,也不能调用那些能引起数据成员值变化的成员函数,只能调用const成 ...

  7. USACO Section 3.3 Camlot(BFS)

    BFS.先算出棋盘上每个点到各个点knight需要的步数:然后枚举所有点,其中再枚举king是自己到的还是knight带它去的(假如是knight带它的,枚举king周围的2格(网上都这么说,似乎是个 ...

  8. MySQL 设置数据库的隔离级别

    在会话级别设置隔离级别 1.read commited :set session transaction isolation level read committed; 2.repeatable re ...

  9. 浅谈qt 布局器

    在一个颜值当道的今天,无论买衣服,买车还是追星,颜值的高低已经变成了大家最看重的(不管男性女性都一样,千万别和我说你不是):而对于程序猿来说,开发一款软件,不再只注重逻辑和稳定性,美观和用户友好性也是 ...

  10. delphi 7 下安装 indy 10.5.8 教程

    本教程用 indy 10.5.8 替换 delphi 7 自带的 indy 版本,让大家深入了解 delphi 组件安装的方法. 第一步:下载 indy 10.5.8 组件,解压到合适的目录里.如 D ...