oracle 行觸發器與語句觸發器的區別 轉

2021-09-08 08:59:10 字數 1649 閱讀 6933

1、行觸發器有 for each row子句。語句觸發器沒有for each row 子句。

2、行觸發器,可以有 when 作為觸發限制,可以使用new/old。語句觸發器不能有when 作為觸發限制。

3、行觸發器:對應dml語句所影響到的表中的每一行,觸發器都要執行一遍。

4、語句觸發:對應dml語句所影響到的表中的所有行,觸發器只執行一遍。

例子:--測試表

create table wdt_test(test number(20));

--日誌表

create table wdt_log(log_no number(20), log_date date);

--觸發器

create or replace trigger buf_wdt_test

before update on wdt_test

--for each row

declare

ln_log_no wdt_log.log_no%type default 0;

begin

select nvl(max(log_no), 0) + 1

into ln_log_no

from wdt_log;

insert into wdt_log

(log_no,

log_date)

values

(ln_log_no,

sysdate);

end;

--測試

sql> insert into wdt_tset (test) values(11);

sql> insert into wdt_tset (test) values(22);

sql> insert into wdt_tset (test) values(33);

sql> update wdt_test set test = 88;

sql> select * from wdt_log order by log_no; --結果只有1條記錄、證明觸發器只工作了一次

將觸發器**中的 for each row 解開注釋,變成行觸發,再繼續測試。

sql> update wdt_test set test = 99;

sql> select * from wdt_log order by log_no; --結果有3條記錄、證明觸發器按行工作了3次

注釋1:nvl方法

從兩個表示式返回乙個非 null 值。

語法nvl(eexpression1, eexpression2)

引數eexpression1, eexpression2

如果 eexpression1 的計算結果為 null 值,則 nvl( ) 返回 eexpression2。如果 eexpression1 的計算結果不是 null 值,則返回 eexpression1。eexpression1 和 eexpression2 可以是任意一種資料型別。如果 eexpression1 與 eexpression2 的結果皆為 null 值,則 nvl( ) 返回 .null.。

返回值型別

字元型、日期型、日期時間型、數值型、貨幣型、邏輯型或 null 值

說明在不支援 null 值或 null 值無關緊要的情況下,可以使用 nvl( ) 來移去計算或操作中的 null 值。

ORACLE觸發器 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸發器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例乙個簡單的...

Oracle觸發器介紹 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例一 個簡...

Oracle觸發器介紹 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例一 個簡...