COMPOUND TRIGGER學習
今天看Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2),對Compound DML Triggers寫了一些學習的測試指令碼。
背景:如果在觸發器裡對觸發器所在表進行DML,會報ORA-04091表變異的錯誤。
測試如下:
建表:create table ABC_TEST
(
zonecode VARCHAR2(14),
disease_id1 NUMBER(4) not null,
intime DATE,
casetype VARCHAR2(1),
casetype2 VARCHAR2(1),
dead NUMBER
)
普通的DML觸發器:CREATE OR REPLACE TRIGGER log_deletions_1
AFTER insert ON abc_test
FOR EACH ROW
DECLARE
n INTEGER;
BEGIN
SELECT COUNT(*) INTO n FROM abc_test; --這句是重點,報錯就是這句引起的
DBMS_OUTPUT.PUT_LINE('There are now ' || n || ' employees.');
END;
插入記錄:
SQL> insert into ABC_TEST values('43012200',198,sysdate,1,1,2);
insert into ABC_TEST values('43012200',198,sysdate,1,1,2)
ORA-04091: table HR.ABC_TEST is mutating, trigger/function may not see it
ORA-06512: at "HR.LOG_DELETIONS_1", line 4
ORA-04088: error during execution of trigger 'HR.LOG_DELETIONS_1'
如果一定要在觸發器查詢自己,可以建成複合觸發器,如下:
CREATE OR REPLACE TRIGGER log_deletions
FOR insert ON abc_test
COMPOUND TRIGGER --這個是關鍵字哦
n INTEGER;
BEFORE STATEMENT IS --插入前查一遍表,這個會在insert之前執行
begin
SELECT COUNT(1) INTO n FROM abc_test;
DBMS_OUTPUT.PUT_LINE('There are now ' || n || ' employees.');
END BEFORE STATEMENT;
AFTER STATEMENT IS --插入後執行,這個會在insert之後執行
BEGIN
SELECT COUNT(1) INTO n FROM abc_test;
DBMS_OUTPUT.PUT_LINE('There are now ' || n || ' employees.');
END AFTER STATEMENT;
END;
SQL> insert into ABC_TEST values('43012200',198,sysdate,1,1,2);
There are now 0 employees.
There are now 1 employees.
1 row inserted
SQL> commit;
Commit complete
看到效果了吧。複合觸發器,能在觸發器之前,先對錶進行查詢,在插入後,可以馬上看到插入的行,神奇吧。
好了,今天就寫到這,學習到compound trriger 的特性。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25027760/viewspace-764589/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORA-04091和Compound Trigger(Oracle 11g)Oracle
- PLSQL學習-【8trigger】SQL
- 融會貫通學習trigger
- 向zepto.js學習如何手動(trigger)觸發DOM事件JS事件
- 關於MySQL的compound-statementSQLMySql
- Compound,區塊鏈銀行運作原理區塊鏈
- Mysql TriggerMySql
- jQuery trigger()jQuery
- ±±oracle trigger±±Oracle
- sql triggerSQL
- salesforce零基礎學習(一百一十三)Trigger中獲取IP地址的過程Salesforce
- Lucene原始碼解析--Compound File 組合檔案原始碼
- Test Oracle triggerOracle
- Head First 設計模式 —— 14. 複合 (Compound) 模式設計模式
- Oracle trigger問題Oracle
- 學習學習再學習
- SqlServer 2005 TriggerSQLServer
- python trigger 組合Python
- logon_triggerGo
- oracle trigger 同步資料Oracle
- Create a trigger TO monitoring DDL
- WPF TryFindResource typeof Setter Trigger
- 深度學習——學習目錄——學習中……深度學習
- trigger 'SYS.GGS_DDL_TRIGGER_BEFORE' is invalid and failed re-validationAI
- Mysql之觸發器triggerMySql觸發器
- /proc/sysrq-trigger檔案
- Database Logoff Trigger SQLDatabaseGoSQL
- TRIGGER裡的動態SQLSQL
- 禁止DDL執行的trigger
- 深度學習(一)深度學習學習資料深度學習
- 深度學習學習框架深度學習框架
- 強化學習-學習筆記3 | 策略學習強化學習筆記
- 學習產品快報09 | “CSDN學習”:增加學習提醒,提示學習不忘記
- 【強化學習】強化學習/增強學習/再勵學習介紹強化學習
- 學習ThinkPHP,學習OneThinkPHP
- 前端學習之Bootstrap學習前端boot
- 學而習之,成就學習
- MySQL入門-- TRIGGER(觸發器)MySql觸發器