日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在oracle中使用Trigger

發(fā)布時間:2023/12/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在oracle中使用Trigger 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、初始目標(biāo)

在對表h1插入一條數(shù)據(jù)時,同時插入一條重復(fù)的數(shù)據(jù)(只有主鍵不同)

2、在PL/SQL里New一個Trigger或者手動敲入代碼

先說明一下,表h1包括4列ID、C1、C2、C3

create or replace trigger Trigger_Testafter insert on h1for each row declare--variables begininsert into h1 values(:new.C1, :new.C2, :new.C3, :new.ID); end Trigger_Test;

3、F8編譯通過,新建一個窗口執(zhí)行insert窗口,測試trigger是否有效,用了一個名為sequence_test的序列:

insert into h1 values('aa','bb','cc',sequence_test.nextval);

報錯:表h1發(fā)生了變化,觸發(fā)器/函數(shù)不能讀。

4、網(wǎng)上搜的說法是“觸發(fā)器不能修改觸發(fā)表的數(shù)據(jù),除非使用自治事務(wù)”,OK那就用自治事務(wù):

declare--variables //改為: declarepragma autonomous_transaction;

再試報錯:等待資源時檢測到死鎖。仔細一查,哦原來是目標(biāo)有問題,Insert連著Insert,無限循環(huán),不是資源死鎖就是內(nèi)存不足或者棧溢出。

5、目標(biāo)更新為:在對表h1插入一條數(shù)據(jù)時,同時插入一條相同的數(shù)據(jù)到歷史表里,把trigger里的insert修改為:

insert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);

再跑又報錯:檢測到活動的自治事務(wù)處理,已經(jīng)回退。

6、網(wǎng)上接著搜,說是有事務(wù)沒提交。其實這是之前目標(biāo)設(shè)定有問題,觸發(fā)器一般不會修改觸發(fā)表,用了自治事務(wù),就要commit;如果是插入歷史表,可以都不加。

declarepragma autonomous_transaction;commit;delete from h1 where ID = 1;commit;//如果不操作觸發(fā)表,則可以去掉自治事務(wù)的這一串聲明 declareinsert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);

7、小結(jié)

  • Trigger在修改其他表(非觸發(fā)表)的時候,最方便,直接像寫存儲過程即可;
  • 若要使用Trigger修改觸發(fā)表的數(shù)據(jù),需要配合使用自治事務(wù)并commit,比較麻煩;
  • 對新操作的記錄本身(比如新Insert/Update/Delete的數(shù)據(jù)),無法做修改,并且如果強行修改的話,既不會報錯,也沒有效果。
  • 轉(zhuǎn)載于:https://www.cnblogs.com/AlexanderYao/p/4514377.html

    總結(jié)

    以上是生活随笔為你收集整理的在oracle中使用Trigger的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。