五、觸發器

--=====================觸發器
/*
觸發器:監視器,監視表中記錄,當對錶中記錄進行操作(增刪改)觸發器工作

--行級觸發器:for each row 使用::old, :new

語法:
create or replace trigger 觸發器名稱
after|before
insert|update|delete
on 表名
declare

begin
  
end;
*/
-- 觸發器監控emp表,當插入一條數據之後,在控制檯輸出:"成功插入數據!"
create or replace trigger tri_emp_after_insert
after
insert
on emp
declare

begin
    dbms_output.put_line('成功插入數據!');
end;

--往emp表中插入一條數據
insert into emp (empno,ename) values (8888,'純情小飛飛');

/*
彈框提示函數:
raise_application_error(p1,p2); 
p1:錯誤代碼 取值範圍-20001  到 -20999之間
p2:提示信息
*/

--不能給員工降薪
create or replace trigger tri_emp_after_update
after
update
on emp
--行級觸發器
for each row
declare


begin
  -- 拿到之前的工資 和 之後工資的進行對比
  if :old.sal > :new.sal then
     raise_application_error(-20001,'不能給員工降薪!');
  end if;
end;

--測試
update emp set sal=sal-1 where empno=7369;
commit;

--===========================觸發器案例:
--使用觸發器實現類型mysql的主鍵自增長效果
-- mysql : insert into emp (ename) values ('abc');


-- 創建序列
create sequence seq_emp_no;

--觸發器
create or replace trigger tri_emp_auto_id
before
insert
on emp
for each row
declare

begin
  select seq_emp_no.nextval into :new.empno from dual;
end;

--沒有觸發器之前,報錯的;有了觸發器之後 ? empno 會自動有值 
insert into emp (ename) values ('熊大');
commit;

select * from emp;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章