婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解oracle中通過觸發器記錄每個語句影響總行數

詳解oracle中通過觸發器記錄每個語句影響總行數

熱門標簽:區域地圖標注怎么設置 電話機器人那種好 地圖標注的坐標點 理財產品電銷機器人 百度地圖標注飯店位置怎么 南通電銷外呼系統哪家強 百度地圖標注注解 上海網絡外呼系統 外呼系統好點子

詳解oracle中通過觸發器記錄每個語句影響總行數

需求產生:

       業務系統中,有一步“抽數”流程,就是把一些數據從其它服務器同步到本庫的目標表。這個過程有可能 多人同時抽數,互相影響。有測試人員反應,原來抽過的數,偶爾就無緣無故的找不到了,有時又會出來重復行。這個問題產生肯定是抽數邏輯問題以及并行的問題了!但他們提了一個簡單的需求:想知道什么時候數據被刪除了,什么時候插入了,我需要監控“表的每一次變更”!

技術選擇:

     第一就想到觸發器,這樣能在不涉及業務系統的代碼情況下,實現監控。觸發器分為“語句級觸發器”和“行級觸發器”。語句級是每一個語句執行前后觸發一次操作,如果我在每一個SQL語句執行后,把表名,時間,影響行寫到記錄表里就行了。

     但問題來了,在語句觸發器中,無法得到該語句的行數,sql%rowcount  在觸發器里報錯。只能用行級觸發器去統計行數!

代碼結構:

整個監控數據行的功能包含: 一個日志表,包,序列。

日志表:記錄目標表名,SQL執行開始、結束時間,影響行數,監控數據行上的某些列信息。

包:主要是3個存儲過程,

  • 語句開始存儲過程:用關聯數組來記錄目標表名和開始時間,把其它值清0.
  • 行操作存儲過程:把關聯數組目標表所對應的記錄數加1。
  • 語句結束存儲過程:把關聯數組目標表中統計的信息寫到日志表。

序列: 用于生成日志表的主鍵

代碼:

日志表和序列:

create table T_CSLOG
(
 n_id   NUMBER not null,
 tblname VARCHAR2(30) not null,
 sj1   DATE,
 sj2   DATE,
 i_hs   NUMBER,
 u_hs   NUMBER,
 d_hs   NUMBER,
 portcode CLOB,
 startrq DATE,
 endrq  DATE,
 bz    VARCHAR2(100),
 n    NUMBER
)
create index IDX_T_CSLOG1 on T_CSLOG (TBLNAME, SJ1, SJ2)
alter table T_CSLOG add constraint PRIKEY_T_CSLOG primary key (N_ID)

  
create sequence SEQ_T_CSLOG
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
cache 20
cycle;

包代碼:

-包頭
create or replace package pck_cslog is
 --聲明一個關聯數組類型,它就是日志表的關聯數組
 type cslog_type is table of t_cslog%rowtype index by t_cslog.tblname%type;
 --聲明這個關聯數組的變量。
 cslog_tbl cslog_type;
 --語句開始。 
 procedure onbegin_cs(v_tblname t_cslog.tblname%type, v_type varchar2);
 --行操作
 procedure oneachrow_cs(v_tblname t_cslog.tblname%type,
             v_type  varchar2,
             v_code  varchar2 := '',
             v_rq   date := '');
 --語句結束,寫到日志表中。
 procedure onend_cs(v_tblname t_cslog.tblname%type, v_type varchar2);
end pck_cslog;

--包體
create or replace package body pck_cslog is
 --私有方法,把關聯數組中的一條記錄寫入庫里
 procedure write_cslog(v_tblname t_cslog.tblname%type) is
 begin
  if cslog_tbl.exists(v_tblname) then
   insert into t_cslog values cslog_tbl (v_tblname);
  end if;
 end;
 --私有方法,清除關聯數組中的一條記錄
 procedure clear_cslog(v_tblname t_cslog.tblname%type) is
 begin
  if cslog_tbl.exists(v_tblname) then
   cslog_tbl.delete(v_tblname);
  end if;
 end;
 --某個SQL語句執行開始。 v_type:語句類型,insert時為 i, update時為u ,delete時為 d
 procedure onbegin_cs(v_tblname t_cslog.tblname%type, v_type varchar2) is
 begin
   --如果關聯數組中不存在,初始賦值。 否則表示,同時有insert,delete語句對目標表操作。
  if not cslog_tbl.exists(v_tblname) then
   cslog_tbl(v_tblname).n_id := seq_t_cslog.nextval;
   cslog_tbl(v_tblname).tblname := v_tblname;
   cslog_tbl(v_tblname).sj1 := sysdate;
   cslog_tbl(v_tblname).sj2 := null;
   cslog_tbl(v_tblname).i_hs := 0;
   cslog_tbl(v_tblname).u_hs := 0;
   cslog_tbl(v_tblname).d_hs := 0;
   cslog_tbl(v_tblname).portcode := ' '; --初始給一個空格
   cslog_tbl(v_tblname).startrq := to_date('9999', 'yyyy');
   cslog_tbl(v_tblname).endrq := to_date('1900', 'yyyy');
   cslog_tbl(v_tblname).n := 0;
  end if;
  cslog_tbl(v_tblname).bz := cslog_tbl(v_tblname).bz || v_type || ',';
  ----第一個語句進入,顯示1,如果以后并行,則該值遞增。
  cslog_tbl(v_tblname).n := cslog_tbl(v_tblname).n + 1; 
 end;
 --每行操作。
 procedure oneachrow_cs(v_tblname t_cslog.tblname%type,
             v_type  varchar2,
             v_code  varchar2 := '',
             v_rq   date := '') is
 begin
  if cslog_tbl.exists(v_tblname) then
   --行數,代碼,起、止時間
   if v_type = 'i' then
    cslog_tbl(v_tblname).i_hs := cslog_tbl(v_tblname).i_hs + 1;
   elsif v_type = 'u' then
    cslog_tbl(v_tblname).u_hs := cslog_tbl(v_tblname).u_hs + 1;
   elsif v_type = 'd' then
    cslog_tbl(v_tblname).d_hs := cslog_tbl(v_tblname).d_hs + 1;
   end if;
   
   if v_code is not null and
     instr(cslog_tbl(v_tblname).portcode, v_code) = 0 then
    cslog_tbl(v_tblname).portcode := cslog_tbl(v_tblname).portcode || ',' || v_code;
   end if;
  
   if v_rq is not null then
    if v_rq > cslog_tbl(v_tblname).endrq then
     cslog_tbl(v_tblname).endrq := v_rq;
    end if;
    if v_rq  cslog_tbl(v_tblname).startrq then
     cslog_tbl(v_tblname).startrq := v_rq;
    end if;
   end if;
  end if;
 end;
 --語句結束。 
 procedure onend_cs(v_tblname t_cslog.tblname%type, v_type varchar2) is
 begin
  if cslog_tbl.exists(v_tblname) then
   cslog_tbl(v_tblname).bz := cslog_tbl(v_tblname)
                 .bz || '-' || v_type || ',';
   --語句退出,將并行標志位減一。 當它為0時,就可以寫表了
   cslog_tbl(v_tblname).n := cslog_tbl(v_tblname).n - 1;
   if cslog_tbl(v_tblname).n = 0 then
    cslog_tbl(v_tblname).sj2 := sysdate;
    write_cslog(v_tblname);
    clear_cslog(v_tblname);
   end if;
  end if;
 end;

begin
 null;
end pck_cslog;

綁定觸發器:

有了以上代碼后,想要監控的一個目標表,只需要給它添加三個觸發器,調用包里對應的存儲過程即可。  假定我要監控  T_A 的表:

     

三個觸發器:

--語句開始前
create or replace trigger tri_onb_t_a
 before insert or delete or update on t_a
declare
 v_type varchar2(1);
begin
 if inserting then  v_type := 'i'; elsif updating then  v_type := 'u'; elsif deleting then  v_type := 'd'; end if;
 pck_cslog.onbegin_cs('t_a', v_type);
end;

--語句結束后
create or replace trigger tri_one_t_a
 after insert or delete or update on t_a
declare
 v_type varchar2(1);
begin
 if inserting then  v_type := 'i'; elsif updating then  v_type := 'u'; elsif deleting then  v_type := 'd'; end if;
 pck_cslog.onend_cs('t_a', v_type);
end;

--行級觸發器
create or replace trigger tri_onr_t_a
 after insert or delete or update on t_a
 for each row
declare
 v_type varchar2(1);
begin
 if inserting then  v_type := 'i'; elsif updating then  v_type := 'u'; elsif deleting then  v_type := 'd'; end if;
 if v_type = 'i' or v_type = 'u' then
  pck_cslog.oneachrow_cs('t_a', v_type, :new.name); --此處是把監控的行的某一列的值傳入包體,這樣最后會記錄到日志表
 elsif v_type = 'd' then
  pck_cslog.oneachrow_cs('t_a', v_type, :old.name);
 end if;
end;

測試成果:

觸發器建好了,可以測試插入刪除了。先插入100行,再隨便刪除一些行。

declare
 i number;
begin
 for i in 1 .. 100 loop
  insert into t_a values (i, i || 'shenjunjian');
 end loop;
 commit;
 
 delete from t_a  where id > 79;
 delete from t_a  where id  40;
 commit;
end;

clob列,還可以顯示監控刪除的行:

并行時,在bz列中,可能會有類似信息:

i,i,-i,-i  ,這表示同一時間有2個語句在插入目標表。

i,d,-d,-i  表示在插入時,有一個刪除語句也在執行。

當平臺多人在用時,避免不了有同時操作同一張表的情況,通過這個列的值,可以觀察到數據庫的執行情況!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章:
  • Oracle中觸發器示例詳解
  • Oracle觸發器trigger詳解
  • Oracle觸發器用法實例詳解
  • oracle監控某表變動觸發器例子(監控增,刪,改)
  • Oracle創建主鍵自增表(sql語句實現)及觸發器應用
  • Oracle中游標Cursor基本用法詳解
  • Oracle存儲過程游標用法分析
  • Oracle顯示游標的使用及游標for循環
  • 快速學習Oracle觸發器和游標

標簽:遼源 自貢 中衛 寧波 海東 百色 昭通 紹興

巨人網絡通訊聲明:本文標題《詳解oracle中通過觸發器記錄每個語句影響總行數》,本文關鍵詞  詳解,oracle,中,通過,觸發器,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解oracle中通過觸發器記錄每個語句影響總行數》相關的同類信息!
  • 本頁收集關于詳解oracle中通過觸發器記錄每個語句影響總行數的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    717成人午夜免费福利电影| 国产精品一区二区91| 日韩三级视频在线看| 亚洲人成在线播放网站岛国| 国产成人免费在线观看不卡| 精品黑人一区二区三区久久| 国产综合色视频| 日韩美女一区二区三区四区| 五月婷婷色综合| 91精品国产一区二区三区蜜臀 | 国产69精品久久777的优势| 国产无人区一区二区三区| 国产不卡视频在线观看| 成人欧美一区二区三区黑人麻豆 | 成人黄色大片在线观看| 亚洲色图.com| 欧美电影在线免费观看| 蜜臀精品久久久久久蜜臀| 久久综合色鬼综合色| 风间由美一区二区av101| 亚洲欧美韩国综合色| 欧美一区二区在线不卡| 岛国一区二区在线观看| 亚洲国产aⅴ天堂久久| 日韩你懂的在线观看| 成人午夜视频福利| 天天操天天干天天综合网| 国产午夜精品在线观看| 欧美三级日韩三级国产三级| 久久 天天综合| 亚洲精品老司机| 久久综合九色综合欧美98| 91免费视频网| 国产乱子轮精品视频| 亚洲线精品一区二区三区八戒| 欧美一区二区国产| 91久久国产最好的精华液| 国产一区二区三区在线观看免费视频| 亚洲图片你懂的| 精品久久久久久久久久久久久久久久久 | 国产日韩精品一区二区三区在线| 91久久免费观看| 国产精品性做久久久久久| 亚洲国产三级在线| 中文字幕成人在线观看| 欧美日韩国产bt| 91香蕉视频污在线| 国产sm精品调教视频网站| 日日摸夜夜添夜夜添精品视频| 中文字幕人成不卡一区| 国产亚洲一区二区三区在线观看| 欧美精品 国产精品| 91久久国产最好的精华液| jlzzjlzz欧美大全| 成人毛片在线观看| 国产宾馆实践打屁股91| 国产一区二区三区黄视频| 另类小说图片综合网| 日av在线不卡| 免费观看成人av| 美女在线视频一区| 久久精品国产99久久6| 免费人成黄页网站在线一区二区| 丝袜国产日韩另类美女| 亚洲第四色夜色| 五月综合激情网| 日韩av电影天堂| 毛片av一区二区| 久久成人免费电影| 久久精品99久久久| 久草精品在线观看| 国产乱码精品一区二区三区av| 精品一二线国产| 国精品**一区二区三区在线蜜桃| 精品中文av资源站在线观看| 国产在线精品一区二区| 成人性色生活片免费看爆迷你毛片| 国产999精品久久久久久| eeuss鲁一区二区三区| 色综合视频在线观看| 欧美亚洲国产bt| 欧美猛男男办公室激情| 日韩一区和二区| 久久精品人人做| 亚洲视频香蕉人妖| 天堂一区二区在线| 国产精品一二三四| 91国在线观看| 日韩精品一区二区三区三区免费| 国产欧美日韩综合精品一区二区| 亚洲女女做受ⅹxx高潮| 日本欧美加勒比视频| 国产一区二区三区最好精华液| 白白色 亚洲乱淫| 欧美高清视频不卡网| 精品99999| 亚洲精品视频自拍| 另类成人小视频在线| 国产成人久久精品77777最新版本| 97se亚洲国产综合自在线不卡| 欧美视频在线一区| 国产欧美日韩久久| 香蕉影视欧美成人| va亚洲va日韩不卡在线观看| 91精品久久久久久蜜臀| 国产精品久久久久一区 | 亚洲欧美日韩小说| 久久国产精品无码网站| 色悠悠久久综合| 日韩精品一区二区三区视频| 综合电影一区二区三区| 久久精品国产99久久6| 欧美羞羞免费网站| 26uuuu精品一区二区| 亚洲一线二线三线久久久| 国产成人av网站| 91精品欧美综合在线观看最新| 国产精品美女久久久久av爽李琼| 日韩精品电影在线| 在线亚洲高清视频| 国产精品麻豆久久久| 久久精品免费观看| 夜夜嗨av一区二区三区中文字幕| 久久久久久免费| 亚洲激情综合网| 精品第一国产综合精品aⅴ| 国产福利不卡视频| 婷婷成人综合网| 2023国产精品视频| 粉嫩aⅴ一区二区三区四区| 欧美激情自拍偷拍| 欧美老女人在线| 色综合久久久久综合| 日本欧美韩国一区三区| 国产精品久久久久久久久免费丝袜 | 精一区二区三区| 国产一区二区久久| 亚洲综合999| 日韩免费成人网| 久久久噜噜噜久久人人看| 奇米精品一区二区三区在线观看 | 精品久久久久久久人人人人传媒| 亚洲欧美另类久久久精品2019| 国产成人8x视频一区二区| 国产亚洲欧美日韩在线一区| 奇米综合一区二区三区精品视频| 欧美日韩在线播放| 亚洲.国产.中文慕字在线| 欧美剧在线免费观看网站 | 欧美日韩精品一区二区在线播放| 一区二区中文视频| 日本道免费精品一区二区三区| 一区二区高清视频在线观看| 在线视频综合导航| 日本成人中文字幕| 久久嫩草精品久久久精品| 东方欧美亚洲色图在线| 亚洲色图欧美激情| 69精品人人人人| 国产精品综合av一区二区国产馆| 国产精品欧美久久久久无广告| 91女厕偷拍女厕偷拍高清| 亚洲图片一区二区| 精品999久久久| 色哟哟日韩精品| 日本不卡在线视频| 亚洲国产精品99久久久久久久久| 97久久久精品综合88久久| 亚洲成人三级小说| 久久久五月婷婷| 色综合视频在线观看| 蜜芽一区二区三区| 国产精品天天看| 在线成人av影院| 丁香一区二区三区| 视频一区中文字幕国产| 国产色婷婷亚洲99精品小说| 在线免费亚洲电影| 国产高清在线观看免费不卡| 亚洲一区二区三区在线播放| 精品国产乱码久久久久久闺蜜| 一本色道久久综合精品竹菊| 狠狠色狠狠色综合系列| 亚洲综合一二区| 国产精品美女久久久久aⅴ| 制服丝袜成人动漫| 成人免费视频国产在线观看| 日韩主播视频在线| 亚洲欧洲av在线| 精品久久久久久久久久久久包黑料| 色综合天天综合给合国产| 老司机精品视频在线| 亚洲制服丝袜一区| 1024成人网| 国产亚洲一区字幕| 欧美精品一区二区精品网| 在线成人免费视频| 欧美日韩午夜影院| 91久久久免费一区二区| 97成人超碰视|