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. 借@阿里巴巴 耍了个帅——HTML5 JavaScript实现图片文字识别与提取

    写在前面 8月底的时候,@阿里巴巴 推出了一款名为“拯救斯诺克”的闯关游戏,作为前端校园招聘的热身,做的相当不错,让我非常喜欢.后来又传出了一条消息,阿里推出了A-star(阿里星)计划,入职阿里的技 ...

  2. Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

    新的keyword auto C++11中引入auto第一种作用是为了自己主动类型推导 auto的自己主动类型推导,用于从初始化表达式中判断出变量的数据类型.通过auto的自己主动类型推导.能够大大简 ...

  3. 编写可维护的JS 06

    7.事件处理 //典型用法 function handlerClick(event){ var popup = document.getElementById('popup'); popup.styl ...

  4. 用js获取周、月第一天和最后一天(转载)

    var getCurrentWeek = function (day) { var days = ["周日", "周一", "周二", &q ...

  5. JavaScript之面向对象学九(原型式继承和寄生式继承)

    一.原型式继承 该继承模式是由道格拉斯*克罗克福德在2006年提出的实现继承的方法. 模式的基本思路:借助原型可以基于已有的对象创建新的对象,同时还不必因此创建自定义类型. 代码如下: functio ...

  6. HTML5增加的几个新的标签

    HTML5又2008年诞生,HTML5大致可以等同于=html+css3+javascriptapi.... so --->支持css3强大的选择器和动画以及javascript的新的函数 先来 ...

  7. Android入门——UI(2)

    介绍SeekBar拖动条控件.ProgressBar进度条控件.DatePicker日历控件.TimePicker时间控件 <?xml version="1.0" encod ...

  8. s2sh遇到的问题

    一:ids for this class must be manually assigned before calling save() "类名.hbm.xml"映射文件中< ...

  9. 如何实现调用console.log(‘good’.repeat(3))时输出goodgoodgood?

    String.prototype.repeat=function(num){ return (new Array(num+1)).join(this) } console.log('good'.rep ...

  10. Chain of Responsibility模式

    熟悉VC/MFC的都知道,VC是“基于消息,事件驱动”,消息在VC开发中起着举足轻重的作用.MFC提供了消息的处理的链式处理策略,处理消息的请求将沿着预定好的路径依次进行处理.消息的发送者并不知道该消 ...