觸發器三 行級DML觸發器 學習筆記

2022-04-19 23:21:34 字數 4118 閱讀 1393

每當一條記錄出現更新操作時進行觸發操作定義時要定義for each row

使用":old.欄位"和":new.欄位"識別符號

no.觸發語句 

:old欄位

:new欄位

1insert 

未定義,字段內容為null

insert操作結束後,為增加資料值

2update

更新資料前的原始值

update操作之後,更新資料後的新值

3delete

刪除前的原始值

未定義,字段內容均為null

":old.欄位"和":new.欄位只對行級觸發有效,如果觸發器沒有定義for each ro則無效而報語法錯誤

示例一、增加員工資訊時,其職位必須在已經職位內選擇,並且工資不能超過5000,入職日期為當前日期

--

建立觸發器

create

orreplace

trigger

myempinsert

before

insert

onmyemp

foreach row

declare

v_date date;

v_jobcount

number

;begin

select

count(empno) into v_jobcount from myemp where:new.job in(select

distinct job from

myemp);

if v_jobcount=

0then

--沒有找到此職位

20009,'

職位錯誤');

else

if :new.sal>

5000

then

-20003,'

工資不能超過5000');

endif;

endif

; :new.hiredate:

=sysdate;

endmyempinsert;

--呼叫執行

declare

begin

--新增錯誤資訊

insert

into myemp(empno,ename,job,mgr,sal,deptno)values(9999,'

bdqn

','mnager

',7788,8000,10

);exception

when others then

dbms_output.put_line(sqlerrm);

end;

示例二、myemp工資漲幅不能超過10%

--

建立觸發器

create

orreplace

trigger

myempaddsal_trigger

before

update

onmyemp

foreach row

declare

begin

ifabs((:new.sal - :old.sal) / :old.sal) >

0.1then

-20005,'

工資最大漲幅不能超過10%');

endif;

endmyempaddsal_trigger;

--呼叫

declare

begin

--新增錯誤資訊

--insert into myemp(empno,ename,job,mgr,sal,deptno)values(9999,'bdqn','mnager',7788,8000,10);

update myemp set sal=

3000

where empno=

7369

;exception

when others then

dbms_output.put_line(sqlerrm);

end;

示例三、使用序列

--

建立表create

table

mt( id

number

, name

varchar2(30

), address

varchar2(50

),

constraint pd_mtid primary

key(id)

);select

*from

mt;--

建立序列

create

sequence mt_se;

--建立觸發器

create

orreplace

trigger

mt_trigger

before

insert

onmt

foreach row

declare

--local variables here

begin

select mt_se.nextval into :new.id from

dual;

endmt_trigger;

--插入資料

insert

into mt(name,address)values('

張三','深圳'

);insert

into mt(name,address)values('

李四','深圳'

);select

*from

mt;--

發現id自動增加

12c自動序列

oracle12c中可以用以下寫法:更直觀

--

建立表create

table

mt( id

number

, name

varchar2(30

), address

varchar2(50

),

constraint pd_mtid primary

key(id)

);create

table mtme as

select

*from mt where1=

2;select

*from

mt;select

*from

mtme;

--建立序列

create

sequence mt_se;

--建立觸發器

create

orreplace

trigger

mtme

before

insert

onmtme

foreach row

declare

begin

delete

mtme;

insert

into mt(id,name,address)values

(mt_se.nextval,:new.name,:new.address);

endmtme;

--插入資料

insert

into mt(name,address)values('

張三','深圳'

);insert

into mt(name,address)values('

李四','

深圳');

觸發器三 行級DML觸發器 學習筆記

每當一條記錄出現更新操作時進行觸發操作定義時要定義for each row 使用 old.欄位 和 new.欄位 識別符號 no.觸發語句 old欄位 new欄位 1insert 未定義,字段內容為null insert操作結束後,為增加資料值 2update 更新資料前的原始值 update操作之...

ORACLE觸發器 行級觸發器

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

Oracle觸發器介紹 行級觸發器

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