在之前的博文中,有提到使用full join, lead等方式校驗數據.
當問題已經發現時,怎麼樣告知程序員,使用者呢? 數據是否已經修正?
如何較為方便的追蹤問題處理結果呢? 該問題出現的頻率如何?
這些檢驗程序運行時間一般都比較長, 如何檢驗同時又避免過多影響系統性能?
我的解決方法是這樣子的.
1. 建立DT_DATA_CHECK記錄待檢測的sql,
這些sql是抓取有問題的數據, 正常情況下應該無記錄.
-
create table DT_DATA_CHECK
-
(
-
class NUMBER(8), --檢測類別
-
name VARCHAR2(30),
-
sql_text VARCHAR2(4000), --檢測sql code
-
enabled VARCHAR2(5), --啟用標記
-
comments VARCHAR2(240),
-
created DATE default sysdate
-
)
2. 將要檢測的sql插入DT_DATA_CHECK表.
3. 每天排程運行dt_data_check的sql_text, 將數據存入dt_data_check_logs日志檔.
check_sql 自定義procedure, 用dbms_xmlgen將前100筆錯誤數據用xmltype方式存入日志檔.
-
create or replace package PKG_DATA_CHECK is
-
procedure check_sql(p_class number, p_name varchar2, p_sql varchar2, rows out number) ; --運行檢測sql,更新log檔
-
procedure check_update ; --只運行有錯誤的sql,
-
procedure check_data_all ; --重行檢測所有sql
-
procedure notice_info; --通知管理員
-
end PKG_DATA_CHECK;
摘錄check_data代碼如下, 点击(此处)折叠或打开
-
procedure check_data is
-
v_cnt pls_integer ;
-
begin
-
for r in ( select class, name, sql_text
-
from dt_data_check
-
where coalesce(enabled,'TRUE')<>'FALSE' )
-
loop
-
begin
-
check_sql(r.class, r.name, r.sql_text, v_cnt);
-
commit ;
-
-
exception
-
when others then
-
raise_application_error(-20013, sqlcode||sqlerrm||chr(10)||r.sql_text) ;
-
end ;
-
end loop;
-
end check_data;
4. 將日志檔中有數據的報表分別發email通知相關人員.
-
select * from dt_data_check_logs where num_rows>0
5. 如用戶告知已經處理. 只重新運行有問題的sql.
重復第 3步,用行package中的check_update
過程更新log.
阿飛
2015/09/14日.
阅读(917) | 评论(0) | 转发(0) |