原文鏈接:http://blog.csdn.net/a19881029/article/details/37820363
-----------------------------------------------------------
Oracle觸發器格式:
- CREATE?[OR?REPLACE]?TRIGGER?trigger_name???
- ????BEFORE|AFTER?INSERT|UPDATE|DELETE?ON?table_name???
- ????[FOR?EACH?ROW]??
- DECLARE?arg_name?type?[CONSTANT]?[NOT?NULL]?[:=value]???
- BEGIN??
- ????pl/sql語句??
- END??
MySQL觸發器格式:
- CREATE?TRIGGER?trigger_name??
- ????BEFORE|AFTER?INSERT|UPDATE|DELETE?ON?table_name??
- ????[FOR?EACH?ROW]??
- BEGIN??
- DECLARE?arg_name1[,arg_name2,...]?type?[DEFAULT?value]??
- ????sql語句??
- END??
創建測試表(建表語句適用于Oracle、MySQL):
- CREATE?TABLE?test(??
- ??id????????????int,??
- ??name??????????varchar(10),??
- ??age???????????int,??
- ??birthday??????date,??
- ??description???varchar(50),??
- ??PRIMARY?KEY?(id)??
- );??
- CREATE?TABLE?test_log(??
- ??id????????????int,??
- ??dealtime??????date,??
- ??dealtype??????varchar(10),??
- ??PRIMARY?KEY?(`id`)??
- );??
Oracle觸發器和MySQL觸發器的區別如下:
1,創建語句格式不同
Oracle:create or replace(Oracle客戶端需要手動提交,MySQL客戶端設置的自動提交)
- SQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_insert??
- ??2?????????BEFORE?INSERT?ON?test??
- ??3?????????FOR?EACH?ROW??
- ??4??BEGIN??
- ??5?????????insert?into?test_log?values(1,sysdate,'insert');??
- ??6??END;??
- ??7??/??
- ???
- Trigger?created??
- ???
- SQL>?insert?into?test(id,?name)?values(1,?'name');??
- ???
- 1?row?inserted??
- ???
- SQL>?commit;??
- ???
- Commit?complete??
- ???
- SQL>?select?*?from?test_log;??
- ???
- ?????????????????????????????????????ID?DEALTIME????DEALTYPE??
- ---------------------------------------?-----------?----------??
- ??????????????????????????????????????1?2014/7/16?1?insert??
MySQL:不包含or replace
- mysql>?delimiter?$??
- CREATE?TRIGGER?trigger_test_insert????
- ????BEFORE?INSERT?ON?test???
- ????FOR?EACH?ROW??
- BEGIN??
- ????insert?into?test_log?values(1,now(),'insert');??
- END$??
- delimiter?;??
- Query?OK,?0?rows?affected??
- ??
- mysql>?insert?into?test(id,?name)?values(1,?'name');??
- Query?OK,?1?row?affected??
- ??
- mysql>?select?*?from?test_log;??
- +----+------------+----------+??
- |?id?|?dealtime???|?dealtype?|??
- +----+------------+----------+??
- |??1?|?2014-07-16?|?insert???|??
- +----+------------+----------+??
- 1?row?in?set??
2,變量的聲明位置、聲明格式均不相同
Oracle:聲明位置在觸發時的執行語句塊外部
通過%type的方式將變量與表特定字段類型相關聯的好處是:在某些情況下,修改該字段類型時不需要修改觸發器(如:字段類型由varchar(10)修改為varchar(20)時,不需要修改觸發器)
- SQL>?CREATE?TRIGGER?trigger_test_insert??
- ??2?????????BEFORE?INSERT?ON?test??
- ??3?????????FOR?EACH?ROW??
- ??4??DECLARE?id1?int?default?1;??
- ??5??????????id2?int:=1;??
- ??6??????????id3?test_log.id%type:=1;??
- ??7??BEGIN??
- ??8??????????insert?into?test_log?values(id1+id2+id3,sysdate,'insert');??
- ??9??END;??
- ?10??/??
- ???
- Trigger?created??
- ???
- SQL>?insert?into?test(id,?name)?values(1,?'name');??
- ???
- 1?row?inserted??
- ???
- SQL>?commit;??
- ???
- Commit?complete??
- ???
- SQL>?select?*?from?test_log;??
- ???
- ?????????????????????????????????????ID?DEALTIME????DEALTYPE??
- ---------------------------------------?-----------?----------??
- ??????????????????????????????????????3?2014/7/16?1?insert??
MySQL:聲明位置在觸發時的執行語句塊內部
- mysql>?delimiter?$??
- CREATE?TRIGGER?trigger_test_insert????
- ????BEFORE?INSERT?ON?test???
- ????FOR?EACH?ROW??
- BEGIN??
- ????DECLARE?id1?int?DEFAULT?1;??
- ????DECLARE?id2?int?DEFAULT?1;??
- ????insert?into?test_log?values(id1+id2,now(),'insert');??
- END$??
- delimiter?;??
- ??
- Query?OK,?0?rows?affected??
- ??
- mysql>?insert?into?test(id,?name)?values(1,?'name');??
- Query?OK,?1?row?affected??
- ??
- mysql>?select?*?from?test_log;??
- +----+------------+----------+??
- |?id?|?dealtime???|?dealtype?|??
- +----+------------+----------+??
- |??2?|?2014-07-16?|?insert???|??
- +----+------------+----------+??
- 1?row?in?set??
3,注釋符不同
Oracle:使用/* */作為注釋符,或者兩個連續的-作為注釋符(PL/SQL塊中至少包含一條可執行語句)
- CREATE?OR?REPLACE?TRIGGER?trigger_test_insert????
- ????BEFORE?INSERT?ON?test???
- ????FOR?EACH?ROW??
- BEGIN??
- ????--just?a?test??
- ??/*?just?a?test?*/??
- ????null;??
- END;??
- /??
MySQL:使用/* */作為注釋符,或者兩個連續的-后加一個空格作為注釋符
- delimiter?$??
- CREATE?TRIGGER?trigger_test_insert????
- ????BEFORE?INSERT?ON?test???
- ????FOR?EACH?ROW??
- BEGIN??
- ????/*?just?a?test?*/??
- ????--?兩個‘-’后面必須帶空格??
- END$??
- delimiter?;??
4,賦值語法不同
Oracle:可以通過select into語句賦值,還可以通過:=進行賦值
- SQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_insert??
- ??2?????BEFORE?INSERT?ON?test??
- ??3?????FOR?EACH?ROW??
- ??4??DECLARE?id?int;??
- ??5??BEGIN??
- ??6?????select?max(tl.id)?into?id?from?test_log?tl;??
- ??7?????if?id?is?null?then??
- ??8?????????id:=1;??
- ??9?????else??
- ?10?????????id:=id+1;??
- ?11?????end?if;??
- ?12?????insert?into?test_log?values(id,sysdate,'insert');??
- ?13??END;??
- ?14??/??
- ???
- Trigger?created??
- ???
- SQL>?insert?into?test(id,?name)?values(1,?'name');??
- ???
- 1?row?inserted??
- ???
- SQL>?commit;??
- ???
- Commit?complete??
- ???
- SQL>?select?*?from?test_log;??
- ???
- ?????????????????????????????????????ID?DEALTIME????DEALTYPE??
- ---------------------------------------?-----------?----------??
- ??????????????????????????????????????1?2014/7/16?1?insert??
MySQL:可以通過select into語句賦值,還可以通過set語句進行賦值
- mysql>?delimiter?$??
- CREATE?TRIGGER?trigger_test_insert????
- ????BEFORE?INSERT?ON?test???
- ????FOR?EACH?ROW??
- BEGIN??
- ????DECLARE?id?int;??
- ????select?max(tl.id)?into?id?from?test_log?tl;??
- ????if?id?is?null?then???
- ????????set?id=1;??
- ????else???
- ????????set?id=id+1;??
- ????end?if;??
- ????insert?into?test_log?values(id,now(),'insert');??
- END$??
- delimiter?;??
- ??
- Query?OK,?0?rows?affected??
- ??
- mysql>?insert?into?test(id,?name)?values(1,?'name');??
- Query?OK,?1?row?affected??
- ??
- mysql>?select?*?from?test_log;??
- +----+------------+----------+??
- |?id?|?dealtime???|?dealtype?|??
- +----+------------+----------+??
- |??1?|?2014-07-16?|?insert???|??
- +----+------------+----------+??
- 1?row?in?set??
5,對于行級更新觸發器
Oracle:原有行用:old表示,新行用:new表示
- SQL>?CREATE?OR?REPLACE?TRIGGER?trigger_test_update??
- ??2?????????BEFORE?UPDATE?ON?test??
- ??3?????????FOR?EACH?ROW??
- ??4??BEGIN??
- ??5?????????:new.description?:=?'change?name['?||??
- ??6??????????????????????????:old.name?||?']->['?||??
- ??7??????????????????????????:new.name?||?']';??
- ??8??END;??
- ??9??/??
- ???
- Trigger?created??
- ???
- SQL>?insert?into?test(id,?name)?values?(1,?'aaa');??
- ???
- 1?row?inserted??
- ???
- SQL>?commit;??
- ???
- Commit?complete??
- ???
- SQL>?update?test?set?name?=?'bbb'?where?id?=?1;??
- ???
- 1?row?updated??
- ???
- SQL>?commit;??
- ???
- Commit?complete??
- ???
- SQL>?select?id,?name,?description?from?test;??
- ???
- ?????????????????????????????????????ID?NAME???????DESCRIPTION??
- ---------------------------------------?----------?----------------------????????????????????????????????????????
- ??????????????????????????????????????1?bbb????????change?name[aaa]->[bbb]??
MySQL:原有行用old表示,新行用new表示
- mysql>?delimiter?$??
- CREATE?TRIGGER?trigger_test_update????
- ????BEFORE?UPDATE?ON?test???
- ????FOR?EACH?ROW??
- BEGIN??
- ????set?new.description?=?concat('change?name[',??
- ????????old.name,']->[',new.name,']');??
- END$??
- delimiter?;??
- ??
- Query?OK,?0?rows?affected??
- ??
- mysql>?insert?into?test(id,?name)?values?(1,?'aaa');??
- Query?OK,?1?row?affected??
- ??
- mysql>?update?test?set?name?=?'bbb'?where?id?=?1;??
- Query?OK,?1?row?affected??
- Rows?matched:?1??Changed:?1??Warnings:?0??
- ??
- mysql>?select?id,?name,?description?from?test;??
- +----+------+-------------------------+??
- |?id?|?name?|?description?????????????|??
- +----+------+-------------------------+??
- |??1?|?bbb??|?change?name[aaa]->[bbb]?|??
- +----+------+-------------------------+??
- 1?row?in?set??
6,其它一些語法、函數上的區別
Oracle:使用if...elsif...else
MySQL:使用if...elseif...else
Oracle:sysdate指代系統時間
MySQL:sysdate()指代系統時間
?