ORACLE中觸發器的判斷IF語句
加一行 NULL 即可例如:SQL> DECLARE 2 testvalue INT; 3 BEGIN 4 testvalue := 200; 5 6 IF testvalue > 100 THEN 7 8 ELSIF testvalue = 100 THEN 9 dbms_*_line( '100' ); 10 ELSE 11 dbms_*_line( '100-' ); 12 END IF; 13 14 END; 15 / ELSIF testvalue = 100 THEN *ERROR 位于第 8 行:ORA-06550: 第 8 行, 第 9 列:PLS-00103: 出現符號 "TESTVALUE"在需要下列之一時::= . ( @% ;ORA-06550: 第 14 行, 第 4 列:PLS-00103: 出現符號 ";"在需要下列之一時:if上面的例子, 可以看出,如果 IF ELSE 里面, 沒有內容, 那么編譯不通過。
下面是 加一行 NULL 通過的例子:SQL> DECLARE 2 testvalue INT; 3 BEGIN 4 testvalue := 200; 5 6 IF testvalue > 100 THEN 7 NULL; 8 ELSIF testvalue = 100 THEN 9 dbms_*_line( '100' ); 10 ELSE 11 dbms_*_line( '100-' ); 12 END IF; 13 14 END; 15 /PL/SQL 過程已成功完成。
按照觸發方式,oracle的觸發器分為語句級和行級兩種類型,在視圖上
DML觸發器有三類:1, insert觸發器;2, update觸發器;3, delete觸發器;觸發器的組成部分: 觸發器的聲明,指定觸發器定時,事件,表名以類型 觸發器的執行,PL/SQL塊或對過程的調用 觸發器的限制條件,通過where子句實現類型: 應用程序觸發器,前臺開發工具提供的; 數據庫觸發器,定義在數據庫內部由某種條件引發;分為: DML觸發器; 數據庫級觸發器; 替代觸發器;DML觸發器組件:1,觸發器定時2,觸發器事件3,表名4, 觸發器類型5, When子句6, 觸發器主體可創建觸發器的對象:數據庫表,數據庫視圖,用戶模式,數據庫實例創建DML觸發器: Create [or replace] trigger [模式.]觸發器名 Before| after insert|delete|(update of 列名)On 表名[for each row]When 條件PL/SQL塊For each row的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的話,表示是表級觸發器,則無論操作多少行,都只觸發一次;When條件的出現說明了,在DML操作的時候也許一定會觸發觸發器,但是觸發器不一定會做實際的工作,比如when 后的條件不為真的時候,觸發器只是簡單地跳過了PL/SQL塊;Insert觸發器的創建:create or replace trigger tg_insertbefore insert on studentbegin dbms_*_line('insert trigger is chufa le 。
..');end;/執行的效果:SQL> insert into student2 values(202,'dongqian','f');insert trigger is chufa le 。..update表級觸發器的例子:create or replace trigger tg_updatestudentafter update on studentbegin dbms_*_line('update trigger is chufale 。
..');end;/運行效果:SQL> update student set se='f';update trigger is chufale 。..已更新8行;可見,表級觸發器在更新了多行的情況下,只觸發了一次;如果在after update on student后加上For each row的話就成為行級觸發器,運行效果:SQL> update student set se='m';update trigger is chufale 。
..update trigger is chufale 。..update trigger is chufale 。
..update trigger is chufale 。..update trigger is chufale 。
..update trigger is chufale 。..update trigger is chufale 。
..update trigger is chufale 。..已更新8行;:new 與: old:必須是針對行級觸發器的,也就是說要使用這兩個變量的觸發器一定有for each row這兩個變量是系統自動提供的數組變量,:new用來記錄新插入的值,old用來記錄被刪除的值;使用insert的時候只有:new里有值;使用delete的時候只有:old里有值;使用update的時候:new和:old里都有值;可以這樣使用: dbms_*_line('insert trigger is chufa dbms_*_line('new id is : '||:* dbms_*_line('new name is : '||:* dbms_*_line('new se is : '||:*);可以這樣從數據字典中查看一個表上有哪幾個觸發器:SQL> select trigger_name from user_triggers2 where table_name=upper('student');TRIGGER_NAME------------------------------TG_INSERTTG_UPDATESTUDENT帶有:old變量的行級delete觸發器:create or replace trigger tg_deletestudentbefore delete on studentfor each rowbegin dbms_*_line('old is: '||:*); dbms_*_line('old name: '||:*e);end;/運行效果:SQL> delete from student;old is: 202old name: dongqianold is: 101old name: liudehuaold is: 102old name: lingqingxiaold is: 103old name: lichanggongold is: 104old name: zhenxiuwenold is: 1001old name: lilianjieold is: 1009old name: tongleifuckold is: 203old name: kfdjold is: 209old name: fuck已刪除9行When的使用:如果在begin也就是說觸發器的PL/SQL主體塊執行前加上when(*='f')的話,DML操作照做不誤,但是只會在刪除Se='f'的那行的時候才會執行觸發器的主體動作,執行效果:SQL> delete from student;old is: 209old name: fuck已刪除9行; 這里雖然刪了9行,但是只執行了一次觸發器的主體,做為一個行級觸發器;混合類型觸發器:Inserting,deleting,updating三個謂詞可以分別指示當前操作到底是哪個;create or replace trigger hunhetriggerbefore insert or update or delete on studentfor each rowbegin if inserting then dbms_*_line('insert le。
'); end if; if deleting then dbms_*_line('delete le 。
.'); end if;end;/插入的時候就自動判斷當前動作為插入:SQL> insert into student values(303,'me','f');insert le。
。刪除的時候就自動判斷當前動作為刪除:SQL> delete from student;delete le 。
。.注意,既然觸發器內部的主體PL/SQL是語句,那么它同樣也可以是插入刪除操作而不一定只是dbms_output打印一些信息;這正是日志表的原理:在用戶執行了DML語句的時候觸發主體為插入日志表以記錄操作軌跡的觸發器;為什么用觸發器? 當我們有兩個表用來記錄商品的出庫入庫情況,good_store用來記錄庫存的產品類別和數量,而good_out用來記錄出庫的產品類別和數量,那么每當我們出庫的某個類別的產品一定數量的時候,我們應該在good_out中插入該產品的類別和出庫數量,而同時也應該在good_store表中用update來更新庫存的相應類別的產品。
ORACLE中觸發器的判斷IF語句
加一行 NULL 即可
例如:
SQL> DECLARE
2 testvalue INT;
3 BEGIN
4 testvalue := 200;
5
6 IF testvalue > 100 THEN
7
8 ELSIF testvalue = 100 THEN
9 dbms_*_line( '100' );
10 ELSE
11 dbms_*_line( '100-' );
12 END IF;
13
14 END;
15 /
ELSIF testvalue = 100 THEN
*
ERROR 位于第 8 行:
ORA-06550: 第 8 行, 第 9 列:
PLS-00103: 出現符號 "TESTVALUE"在需要下列之一時:
:= . ( @
% ;
ORA-06550: 第 14 行, 第 4 列:
PLS-00103: 出現符號 ";"在需要下列之一時:
if
上面的例子, 可以看出,如果 IF ELSE 里面, 沒有內容, 那么編譯不通過。
下面是 加一行 NULL 通過的例子:
SQL> DECLARE
2 testvalue INT;
3 BEGIN
4 testvalue := 200;
5
6 IF testvalue > 100 THEN
7 NULL;
8 ELSIF testvalue = 100 THEN
9 dbms_*_line( '100' );
10 ELSE
11 dbms_*_line( '100-' );
12 END IF;
13
14 END;
15 /
PL/SQL 過程已成功完成。
Oracle中觸發器有幾種,用法與SQL Server一樣嗎
ORACLE觸發器有以下兩類: 1 語句級(Statement-level)觸發器,在CREATE TRIGGER語句中不包含FOR EACH ROW子句。
語句級觸發器對于觸發事件只能觸發一次, 而且不能訪問受觸發器影響的每一行的列值。一般用語句級觸發器處理有關引起觸發器觸發的SQL語句的信息——例如,由誰來執行 2 行級(Row-level)觸發器,在CREATE TRIGGER語句中包含FOR EACH ROW子句。
行級觸發器可對受觸發器影響的每一行觸發,并且能 夠訪問原列值和通過SQL語句處理的新列值。行級觸發器的典型應用是當需要知道行的列值時,執行一條事務規則。
SQL Server支持兩種類型的觸發器: AFTER 觸發器和INSTEAD OF 觸發器。其中AFTER 類型觸發器要求只有執行某一操作(INSERT UPDATE DELETE) 之后,觸發器才被觸發,且只能在表上定義。
可以為針對表的同一操作定義多個觸發器。對于AFTER 觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最后觸發,通常使用系統過程sp_settriggerorder 來完成此任務。
INSTEAD OF 觸發器表示并不執行其所定義的操作(INSERT、 UPDATE、 DELETE),而僅是執行觸發器本身。既可在表上定義INSTEAD OF 觸發器,也可以在視圖上定義INSTEAD OF 觸發器,但對同一操作只能定義一個INSTEAD OF 觸發器。
轉載請注明出處華閱文章網 » oracle觸發器語句