每當一條記錄出現更新操作時進行觸發操作定義時要定義for each row
使用":old.欄位"和":new.欄位"識別符號
no.觸發語句
:old欄位
:new欄位
1insert
未定義,字段內容為null
insert操作結束後,為增加資料值
2update
更新資料前的原始值
update操作之後,更新資料後的新值
3delete
刪除前的原始值
未定義,字段內容均為null
":old.欄位"和":new.欄位只對行級觸發有效,如果觸發器沒有定義for each ro則無效而報語法錯誤
示例一、增加員工資訊時,其職位必須在已經職位內選擇,並且工資不能超過5000,入職日期為當前日期
--示例二、myemp工資漲幅不能超過10%建立觸發器
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;
--示例三、使用序列建立觸發器
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;
--12c自動序列 oracle12c中可以用以下寫法:更直觀建立表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自動增加
--建立表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會話中建立和示例一 個簡...