plsql(轻量版)_触发器
生活随笔
收集整理的這篇文章主要介紹了
plsql(轻量版)_触发器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
觸發器是許多關系型數據庫系統都提供的一項技術,在ORACLE系統里,觸發器類似過程和函數,都有聲明,執行和異常處理過程的PL/SQL塊,這是他創建的一個格式,這個觸發器的作用是什么,觸發器以獨立的對象存儲,就像你在這兒一樣能夠看到,這是函數了,這里就是觸發器
然后呢,與存儲過程不同的是,存儲過程使用其他程序來啟動運行,或者直接啟動運行,我們使用declare,begin去調用這個函數,就像JAVA里的方法一樣,用這個對象來掉,而這個觸發器不一樣,觸發器是使用一個事件來啟動運行的,觸發一個事件,事件一啟動,一運行,我觸發器就運行,觸發器是當某個事件發生時自動的隱式的運行,你看不著,但有的時候是看不著的,并且觸發器是不能夠接收參數的,所以運行觸發器的過程叫做,觸發或者點火,ORACLE事件指的是對表進行的增刪改,類似的一個操作,這個叫觸發,觸發器需要你關注的點,有這樣幾個,一個是觸發器事件,就是因為什么會導致他的發生,DML里面的增刪改,它會導致觸發事件的發生,那這個觸發的事件是在你觸發的事件之前,還是在之后,觸發器本身,就是你觸發器本身想干什么,就是你觸發器本身的操作,觸發的頻率,頻率分成兩個,一個叫語句級,一個叫行級,如果你進行一個update的操作,update你想把所有人的數據都加100,都加100,你是需要我在整個都加完以后,觸發一次,還是每加一個人就觸發一次,這就分成了語句級和行級,行級就是update一次就觸發一次,語句級是整個update完了以后,當然也不一定以后,就是你是想前還是后呢,然后觸發一次,這就是觸發器需要理解的四塊
具體怎樣來聲明,這樣的格式,create or replace trigger,觸發器名,然后你是要在事件之前或之后執行,觸發事件是增刪改哪一個,然后是作用哪一個表里的,是一個行級的還是一個語句級的,是這樣一個過程,寫一個helloworld觸發器一個helloworld級別的觸發器
create or replace trigger hello_trigger
after
update on employees
--for each row
begin dbms_output.put_line('hello...');--dbms_output.put_line('old.salary:'|| :OLD.salary||',new.salary'||:NEW.salary);
end;
然后執行:update employees set salary = salary + 1000;就是當你每更新employees表的時候,就執行一次,每更新一次employees表我就給你插入一下,create or replacetrigger,然后叫update emp這個表的,trigger,然后你是想還是之后,之后after,after update on,employees這個表,然后你是每一行都要這樣操作嗎,是的話就寫false,for each row,然后呢你想干什么,你想干什么,你想干什么就寫begin,后邊讓他去執行,begin,dbms_output.put_line,每執行一次就讓你輸出helloworld,end結束create or replace trigger update_emp_triggerafterupdate on employeesfor each rowbegindbms_output.put_line('helloworld');end;
創建好了,創建好了你在這看,當你每次對employees表進行Update的時候,我就觸發這個事件,update employees set salary = salary + 100;我要這樣寫的話所有的都執行了,比如where department_id = 80,80號部門的全增加100,當你一執行update,他就觸發他的事件
80號部門有34個人,然后你可以trigger1,當你update他的時候,不讓你每行都執行,就是最后執行一下,把這個給他去掉create or replace trigger update_emp_trigger1afterupdate on employeesbegindbms_output.put_line('helloworld');end;
然后執行這個,就一條update employees set salary = salary + 100 where department_id = 80
34條update,但是只輸出一個,這個就是叫觸發器,實際上你沒有調觸發器,觸發器是自動執行的28. 觸發器的 helloworld: 編寫一個觸發器, 在向 emp 表中插入記錄時, 打印 'helloworld'create or replace trigger emp_trigger
after
insert on emp
for each row
begindbms_output.put_line('helloworld');
end;當你每插入的時候讓你執行,剛才我們創建的叫update,你創建這個觸發器,僅僅你這個update的時候有效,假設你要給他insert一條數據的時候,無效的,這個表太大了,insert的時候聽嘔心的,我創建一條吧,create table emp,as select employee_id,salary,email from employeescreate table emp1asselect employee_id,salary,email from employeeswhere department_id = 80
創建了一個table,然后我創建一個觸發table的一個觸發器,然后讓他作用在emp1上,這個觸發器,僅僅這個表的update操作create or replace trigger update_emp_trigger1afterupdate on emp1begindbms_output.put_line('helloworld');end;
改個名trigger2create or replace trigger update_emp_trigger2afterupdate on emp1begindbms_output.put_line('helloworld');end;
當你update,emp1,set salary = salary + 100,就這樣update emp1 set salary = salary + 100;
我們這個是語句及的,當你想執行比如說insert,insert操作你看會不會觸發,添加了,并沒有導致觸發器的執行insert into emp1values (1001,20000,'aa@gmail.com');
因為你是插入的,插入操作不會觸發他,你要想觸發你得有一個insert的,insert on這個表create or replace trigger insert_emp_trigger3afterinsert on emp1begindbms_output.put_line('helloworld');end;
這個創建好了,來一個1002吧insert into emp1values(1002,20000,'aa@gmail.com')
我insert就觸發他了,這個我們就往下走吧29. 行級觸發器: 每更新 employees 表中的一條記錄, 都會導致觸發器執行create or replace trigger employees_trigger
after
update on employees
for each row
begindbms_output.put_line('修改了一條記錄!');
end;語句級觸發器: 一個 update/delete/insert 語句只使觸發器執行一次create or replace trigger employees_trigger
after
update on employees
begindbms_output.put_line('修改了一條記錄!');
end;沒更新就觸發他,這個我們已經說了30. 使用 :new, :old 修飾符create or replace trigger employees_trigger
after
update on employees
for each row
begindbms_output.put_line('old salary: ' || :old.salary || ', new salary: ' || :new.salary);
end;有一個這個概念,冒號new,冒號old,當你update一個表的時候,冒號old,比如我想update salary,工資都漲一百,那么漲一百以后,我想看看舊的工資是多少,我們就可以使用這兩個符號,你看這個,這里邊的2跟3是我們剛創建的,這個是作用在emp1的,進行update的
select * from emp1;這是這個表的信息
然后我現在update他,我先改一下觸發器,這里有觸發器,怎么改,作用在每一行上,不打印這個了,打印當你update的時候,舊的那個值,新的值沒有打出來,old:salary,這是字符串,雙豎線冒號,old.salary,后面new salary,冒號new點salary,輸出一下update之前的那個值,和之后的值create or replace trigger update_emp_triggerafterupdate on emp1for each rowbegindbms_output.put_line('old:salary'||:old.salary||','||'new salary:'||:new.salary);end;
創建好了,創建好了以后,update,emp1,set,salary = salary +100,這是個舊的,2萬加上100以后的update emp1 set salary = salary + 100;
那這個很有用,我可以把更新之前的值和之后的值都獲取到,如果你只想要舊的,為啥說他挺好,你看這個題31. 編寫一個觸發器, 在對 my_emp 記錄進行刪除的時候, 在 my_emp_bak 表中備份對應的記錄1). 準備工作:create table my_emp as select employee_id id, last_name name, salary sal from employeescreate table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 22).
create or replace trigger bak_emp_triggerbefore delete on my_empfor each rowbegininsert into my_emp_bak values(:old.id, :old.name, :old.sal);
end; 編寫一個觸發器,在堆這個表進行刪除的時候,在這個表當中再進行對應備份表的記錄,這邊在刪除,實際上他導致了觸發器的執行,觸發器你刪一條我就加一條,你刪完了我就給你復制過來了,當然前提現在有兩個表,這個表的所有數據都拿過來了create table my_empasselect employee_id,salary from employees
我這個時候select * from my_emp;
create table my_emp_bakasselect employee_id,salary from employees where 1=2
當你這個時候select * from my_emp_bak;這個表是空的
這個表有,這個表沒有,我現在呢,當你把這個表清空的時候,create or repalce trigger,delete emp表的時候,before,delete,on my_emp,for each row,begin,怎么執行,當你一刪除這個表的時候,我就insert into,my_emp_bak,values,這個表的表結構,怎么獲取到,冒號old點employee_id,逗號冒號,這樣的,能看懂不,當你一刪除的,刪除的時候就觸發這個,我就把你這個old,你要刪的表的舊的信息添加到新表里create or replace trigger delete_emp_triggerbeforedelete on my_empfor each rowbegininsert into my_emp_bakvalues(:old.employee_id,:old.salary);end;
delete from my _emp;清空
這個時候select * from my_emp;
select * from my_emp_bak;
就是你剛剛刪的,這個就是觸發器,然后你這個時候要給他commitcommit;
觸發器就是這樣的,它是自動給你執行的,看不到,整個就講完了PL/SQL,大家你需要掌握的,實際上是這兩個,前面的都集成到這里了
?
總結
以上是生活随笔為你收集整理的plsql(轻量版)_触发器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: plsql(轻量版)-存储函数存储过程
- 下一篇: spring项目搭建-导包对象准备