分為行級與語句級;行級就是每受影響的一行就觸發改行一次,語句級就是觸發一次語句執行一次,不論該語句影響了幾行
--20200429加入 begin
刪除、更新都有:old與:new,插入只有:new
如果操作表的時候,在乙個語句塊內,觸發器執行異常,則該語句塊將全部回滾,如:
--觸發器create or replace trigger trigger2
before insert on aaa
for each row
begin
--dbms_output.put_line(:new
.column1);
delete aaa
where id=:new
.column1;
end;
begininsert into aaa values('5
','5');
insert into aaa values('6
','1
'); --因為有外來鍵這條刪不掉
end;
結果是aaa表無任何變化,驗證成功!
--end
最基礎的就是:new與:old
這兩個變數只有在使用了關鍵字 "for each row"時才存在(這個就是行級)
理解一下就能夠知道的是 update都存在;insert只存在:new;delete只存在:old
after與befor
這個理解一下就能知道befor 就是資料庫本身事務提交之前觸發;after就是執行完本身事務之後觸發;(這裡提到了事務,後面會提到為什麼會提及事務)
另外需要說的是,通過update語句更新行,即使改行沒變化,但是執行語句了,也是會觸發update影響行數的,因此下方**考慮到了這一點
(下方示例是如果狀態發生了變更,並且名字包含'op',那麼我執行資料庫的操作)
createorreplace
trigger
equip_state2mes
after
update
of equip_state on
p_equip_work_state
foreach row
begin
if(:old.equip_state!=:new.equip_state) then
if(:old.equip_name like
'%op%')
then
insert
into
equip_alarm_mes (equip_alarm_mes_id,equip_code,alarm_code,alarm_description,alarm_start_time,remark)
values(sys_guid(),:old.equip_code,:old.equip_name,:new.equip_state,sysdate,'1'
);
endif
;
endif
;end;
對於上方提到的事務,下面就需要了(我想要宣告變數,去判別滿足條件的數量,如果滿足我再執行對同一張表的操作)(如果(操作)插入的時候使用:new :old這樣不需要判別內外事務了)
(但是如果按照正常寫法而不使用:new:old關鍵字的話,更新和插入同一張表預設為同乙個事務,這樣我個人理解為事務互相等待,這樣提交不了,需要顯示自定義事務來解決)
(不要考慮上方的了,就是當對同一張表進行操作,在觸發器中的操作我們使用自定義的事務,並且顯示提交它,就可以!!!不同的表,當然如上方的**,裡面使用:new :old即可)
(總之能使用:new :old就是用這個就好,這樣肯定沒問題)
(pragma autonomous_transaction; )
createorreplace
trigger
nxjceshi
after
update
of col1 on
zzznew
foreach row
declare sourceusertpcount number:=0;
pragma autonomous_transaction;
begin
select
count(*) into sourceusertpcount from zzznew where :new.col1 in (select transfer_number from zzz);--
:new.col1這樣執行才會完成功能,否則直接寫col1,它會預設為前一次的
if(sourceusertpcount>
0) then
insert
into zzznew (key) values
(sys_guid());
commit; --
必須顯示提交事務
endif
;end;
Oracle觸發器簡單示例
首先建立兩張測試表 create table test t id number 4 t name varchar2 20 t age number 2 t char create table test log caozuo varchar2 20 tdate date 然後建立觸發器並且進行測試 c...
oracle序列觸發器簡單實現示例
建立oracle主鍵自增長 1.建表 create table test id number 10 primary key,name varchar2 20 2.建立序列 create sequence test sequence minvalue 1 自增最小值 maxvalue 9999999 ...
Oracle資料庫簡單觸發器示例
建立觸發器dept trigger create or replace trigger dept trigger 觸發條件 對dept bak中每行資料進行插入編輯刪除時觸發 before insert or update or delete on dept bak for each row beg...