ORACLE觸發器 行級觸發器

2021-04-24 19:10:27 字數 3502 閱讀 1841

行級觸發器

本章介紹行級觸發器機制。大部分例子以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行級觸發...