行級觸發器
本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。
1、介紹
觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl/sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql*plus會話中建立和示例一 個簡單的insert行級觸發器。這個觸發器呼叫dbms_output在每插入一行資料時列印「executing temp_air」
sql> set feedback off
sql> create table temp (n number);
sql> create or replace trigger temp_air
2 after insert on temp
3 for each row
4 begin
5 dbms_output.put_line('executing temp_air');
6 end;
7 /
8 sql> insert into temp values (1); -- insert 1 row
executing temp_air
sql> insert into temp select * from temp; -- insert 1 row
executing temp_air
sql> insert into temp select * from temp; -- inserts 2 rows
executing temp_air
executing temp_air
sql>
儘管第三個insert語句是一條sql語句,但插入temp表中兩條記錄。許多insert語句插入一條記錄,但可以用一條語句插入許多行。
2、行級觸發器語法:
create or replace trigger trigger_name
after|before insert|update|delete on table_name
for each row
[when (boolean expression)]
declare
local declarations
begin
trigger body written pl/sql
end;
·trigger_name
用觸發器名來確定表名和觸發器型別。pl/sql執行時錯誤將產生乙個pl/sql錯誤資訊,涉及觸發器名和行數。下面oracle錯誤顯示了在students表上的after-insert行觸發器的第5行有乙個被0除錯誤。
ora-01476: divisor is equal to zero
ora-06512: at "scott.students_air", line 5
ora-04088: error during execution of trigger
'scott.students_air'
行記數從關鍵字declare行開始,如果沒有declare部分,begin語句是第一行。觸發器名稱儲存在user_triggers表的trigger_name。觸發器名一般由表名、觸發器型別、觸發事件,語法如下:
trigger_name = table_name_[a|b] [i|u|d] [r|s]
trigger_name 最長30個字元,所以有時不得不使用表名縮寫。常表名一般要有乙個規則的縮寫。這樣可以減少故障分析處理時間。
[a|b] 表示是after 或 before 觸發器型別
[i|u|d] 表示觸發事件,可能是 insert ,update 或者delete
[r|s] 表示行級(row)或語句級(statement)觸發器型別。
·before|after insert on table_name
這條語句告訴oracle什麼時候執行觸發器.它可能在oracle 完整性約束檢查前或後執行,可以指定乙個before或after觸發器在多語句操作型別上觸發,如:
before insert or update on table_name
before insert or update or delete on table_name
after insert or delete on table_name
dbms_standard 包提供了四個boolean函式來區分sql語句型別。
package dbms_standard is
function inserting return boolean;
function updating return boolean;
function updating (colnam varchar2) return boolean;
function deleting return boolean;
etc,
end dbms_standard;
在觸發器中可以直接使用函式名稱,不需要指定包名:
create or replace trigger temp_aiur
after insert or update on temp
for each row
begin
case
when inserting then
dbms_output.put_line
('executing temp_aiur - insert');
when updating then
dbms_output.put_line
('executing temp_aiur - update');
end case;
end;
對於update行級觸發器,可以指定被更新的列作為觸發器觸發條件。
create or replace trigger temp_aur
after insert or update of m, p on temp
for each row
begin
dbms_output.put_line
('after insert or update of m, p');
end;
·when(boolean expression)
這是個可選語句,用來過濾觸發觸發器的條件。
create or replace trigger temp_air
after insert on temp
for each row
when (new.n = 0)
begin
dbms_output.put_line('executing temp_air');
end;
上例中表示after insert行觸發器觸發的條件是:n欄位的值等於0.
new.column_name : insert或update觸發器中when語句中引用欄位的語法。
old.column_name : 用於update或delete行級觸發器中when語句中。在insert語句中為null。
Oracle觸發器介紹 行級觸發器
行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例一 個簡...
ORACLE觸發器 行級觸發器
行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸發器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例乙個簡單的...
行級觸發器
行級觸發器 1觸發器使用for each row選項 2行級觸發器進行dml操作時,每作用一行就觸發一次。行級觸發器分類 1before行級觸發器 為了確保資料符合商業邏輯和企業規劃,應該使用約束對輸入資料加以限制。在某些情況下約束無法實現複雜的商業邏輯和企業規範,這時候可以使用before行級觸發...