最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle中的觸發(fā)器(trigger)用法及解讀

 更新時間:2026年05月08日 14:55:20   作者:象在舞  
文章主要介紹了數(shù)據(jù)庫觸發(fā)器的概念、語法、注意事項以及基本要點,并提供了創(chuàng)建基于值的觸發(fā)器的示例,觸發(fā)器是在特定數(shù)據(jù)操作時自動執(zhí)行的PL/SQL語句序列,主要用于保證數(shù)據(jù)一致性和完整性

1、觸發(fā)器的定義

數(shù)據(jù)庫觸發(fā)器是一個與表相關(guān)聯(lián)、存儲PL/SQL語句的“東西”。

每當(dāng)一個特定的數(shù)據(jù)操作語句(insert、update、delete)在指定的表上發(fā)出時,Oracle自動執(zhí)行觸發(fā)器中定義的語句序列。

例如:當(dāng)員工信息插入后,自動輸出“插入成功”的信息。

create or replace trigger empTrigger
 after insert on emp 
 for each row
declare
 -- 這里存放本地變量
begin
 dbms_output.put_line('插入成功!');
end empTrigger;

2、觸發(fā)器的語法

上面是一個觸發(fā)器簡單的例子,我們接下來看下觸發(fā)器的語法:

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;

其中:

(1)BEFORE和AFTER指出觸發(fā)器的觸發(fā)時序分別為前觸發(fā)和后觸發(fā)方式,前觸發(fā)是在執(zhí)行觸發(fā)事件之前觸發(fā)當(dāng)前所創(chuàng)建的觸發(fā)器,后觸發(fā)是在執(zhí)行觸發(fā)事件之后觸發(fā)當(dāng)前所創(chuàng)建的觸發(fā)器。

(2)FOR EACH ROW選項說明觸發(fā)器為行觸發(fā)器。行觸發(fā)器和語句觸發(fā)器的區(qū)別表現(xiàn)在:行觸發(fā)器要求當(dāng)一個DML語句操走影響數(shù)據(jù)庫中的多行數(shù)據(jù)時,對于其中的每個數(shù)據(jù)行,只要它們符合觸發(fā)約束條件,均激活一次觸發(fā)器;而語句觸發(fā)器將整個語句操作作為觸發(fā)事件,當(dāng)它符合約束條件時,激活一次觸發(fā)器。當(dāng)省略FOR EACH ROW 選項時,BEFORE和AFTER觸發(fā)器為語句觸發(fā)器,而INSTEAD OF觸發(fā)器則只能為行觸發(fā)器。

(3)REFERENCING子句說明相關(guān)名稱,在行觸發(fā)器的PL/SQL塊和WHEN子句中可以使用相關(guān)名稱參照當(dāng)前的新、舊列值,默認(rèn)的相關(guān)名稱分別為OLD和NEW。觸發(fā)器的PL/SQL塊中應(yīng)用相關(guān)名稱時,必須在它們之前加冒號(:),但在WHEN子句中則不能加冒號。

(4)WHEN子句說明觸發(fā)約束條件。Condition為一個邏輯表達(dá)時,其中必須包含相關(guān)名稱,而不能包含查詢語句,也不能調(diào)用PL/SQL函數(shù)。WHEN 子句指定的觸發(fā)約束條件只能用在BEFORE和AFTER行觸發(fā)器中,不能用在INSTEAD OF行觸發(fā)器和其它類型的觸發(fā)器中。

(5)當(dāng)一個基表被修改(INSERT、 UPDATE、DELETE)時要執(zhí)行的存儲過程,執(zhí)行時根據(jù)其所依附的基表改動而自動觸發(fā),因此與應(yīng)用程序無關(guān),用數(shù)據(jù)庫觸發(fā)器可以保證數(shù)據(jù)的一致性和完整性。

行觸發(fā)器要求當(dāng)一個DML語句操作影響數(shù)據(jù)庫中的多行數(shù)據(jù)時,對于其中的每個數(shù)據(jù)行,只要它們符合觸發(fā)約束條件,均激活一次觸發(fā)器;在行級觸發(fā)器中,使用:old和:new偽記錄變量,識別值的狀態(tài)。語句觸發(fā)器將整個語句操作作為觸發(fā)事件,當(dāng)它符合約束條件時,激活一次觸發(fā)器。

3、觸發(fā)器的其他注意事項

觸發(fā)器名與過程名和包的名字不一樣,它是單獨的名字空間,因而觸發(fā)器名可以和表或過程有相同的名字,但在一個模式中觸發(fā)器名不能相同。

DML觸發(fā)器的限制:

(1)CREATE TRIGGER語句文本的字符長度不能超過32KB。

(2)觸發(fā)器體內(nèi)的SELECT語句只能為SELECT … INTO結(jié)構(gòu),或者為定義游標(biāo)所使用的SELECT語句。

(3)觸發(fā)器中不能使用數(shù)據(jù)庫事務(wù)控制語句COMMIT、ROLLBACK語句。

(4)由觸發(fā)器所調(diào)用的過程或函數(shù)也不能使用數(shù)據(jù)庫事務(wù)控制語句。

(5)觸發(fā)器中不能使用LONG、LONG RAW類型。

(6)觸發(fā)器內(nèi)可以參照LOB類型列的列值,但不能通過 :NEW 修改LOB列中的數(shù)據(jù)。

4、DML觸發(fā)器基本要點

(1)觸發(fā)時機(jī):指定觸發(fā)器的觸發(fā)時間。如果指定為BEFORE,則表示在執(zhí)行DML操作之前觸發(fā),以便防止某些錯誤操作發(fā)生或?qū)崿F(xiàn)某些業(yè)務(wù)規(guī)則;如果指定為AFTER,則表示在執(zhí)行DML操作之后觸發(fā),以便記錄該操作或做某些事后處理。

(2)觸發(fā)事件:引起觸發(fā)器被觸發(fā)的事件,即DML操作(INSERT、UPDATE、DELETE)。既可以是單個觸發(fā)事件,也可以是多個觸發(fā)事件的組合(只能使用OR邏輯組合,不能使用AND邏輯組合)。

(3)條件謂詞:當(dāng)在觸發(fā)器中包含多個觸發(fā)事件(INSERT、UPDATE、DELETE)的組合時,為了分別針對不同的事件進(jìn)行不同的處理,需要使用ORACLE提供的如下條件謂詞。

  • INSERTING:當(dāng)觸發(fā)事件是INSERT時,取值為TRUE,否則為FALSE。
  • UPDATING [(column_1,column_2,…,column_x)]:當(dāng)觸發(fā)事件是UPDATE時,如果修改了column_x列,則取值為TRUE,否則為FALSE。其中column_x是可選的。
  • DELETING:當(dāng)觸發(fā)事件是DELETE時,則取值為TRUE,否則為FALSE。

(4)解發(fā)對象:指定觸發(fā)器是創(chuàng)建在哪個表、視圖上。

(5)觸發(fā)類型:是語句級還是行級觸發(fā)器。

(6)觸發(fā)條件:由WHEN子句指定一個邏輯表達(dá)式,只允許在行級觸發(fā)器上指定觸發(fā)條件,指定UPDATING后面的列的列表。

5、示例

(1)禁止在非工作時間插入數(shù)據(jù)。

create or replace trigger addEmpInfoCheck
 before insert on emp_info 
declare
begin

 if to_char(sysdate, 'day') in ('星期六', '星期日') or
 to_number(to_char(sysdate, 'hh24')) not between 9 and 18 then
 --禁止insert 
 raise_application_error(-20001,'非工作時間禁止插入數(shù)據(jù)!');
 end if;
end addEmpInfoCheck;

raise_application_error用于在plsql使用程序中自定義不正確消息。

該異常只在數(shù)據(jù)庫端的子程序(流程、函數(shù)、包、觸發(fā)器)中運用,而無法在匿名塊和客戶端的子程序中運用。

語法為raise_application_error(error_number,message[,[truefalse]])。

其中error_number用于定義不正確號,該不正確號必須在-20000到-20999之間的負(fù)整數(shù);message用于指定不正確消息,并且該消息的長度無法超過2048字節(jié)。

(2)漲薪后的工資應(yīng)該大于漲薪前的工資。

create or replace trigger checkSalary
 before update 
 on salary_info 
 for each row
declare
 --沒有變量聲明的話,declare可以省略
begin

 if :new.sal < :old.sal then
 raise_application_error(-20002,'漲后的薪水:'|| :new.sal ||'小于漲前的薪水:'||:old.sal);
 end if;
end checkSalary;

(3)創(chuàng)建基于值的觸發(fā)器

create table xzw_test(info varchar2(256));

create or replace trigger addData
 after update
 on xzw_test 
 for each row
declare
begin

 if :new.sal > 6000 then 
 insert into xzw_test values(:new.sal ||'-'|| :new.username ||'-'|| :new.job);
 end if;

end addData;

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • oracle date類型比較時間方式

    oracle date類型比較時間方式

    在Oracle數(shù)據(jù)庫中比較DATE類型的時間部分,可以使用多種方法,包括使用TO_CHAR和時間格式提取時間部分、使用EXTRACT函數(shù)提取特定時間部分、使用INTERVAL進(jìn)行時間比較以及轉(zhuǎn)換為TIMESTAMP進(jìn)行比較,每種方法都有其適用的場景,選擇合適的方法取決于具體需求
    2025-02-02
  • 分享Oracle 11G Client 客戶端安裝步驟(圖文詳解)

    分享Oracle 11G Client 客戶端安裝步驟(圖文詳解)

    這篇文章主要介紹了分享Oracle 11G Client 客戶端安裝步驟(圖文詳解),非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • 使用oracle發(fā)生標(biāo)識符無效問題及解決

    使用oracle發(fā)生標(biāo)識符無效問題及解決

    這篇文章主要介紹了使用oracle發(fā)生標(biāo)識符無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • oracle數(shù)據(jù)庫慢查詢SQL實例詳解

    oracle數(shù)據(jù)庫慢查詢SQL實例詳解

    一般的業(yè)務(wù)系統(tǒng)如果遇到性能問題,絕大部分都是來自數(shù)據(jù)庫的,有的業(yè)務(wù)一個查詢執(zhí)行時間好幾秒,這就是我們說說的SQL慢查詢,這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫慢查詢SQL的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • Oracle執(zhí)行計劃及性能調(diào)優(yōu)詳解使用方法

    Oracle執(zhí)行計劃及性能調(diào)優(yōu)詳解使用方法

    在Oracle數(shù)據(jù)庫中,通過使用EXPLAIN PLAN、AWR、SQL Trace等工具可以對SQL性能進(jìn)行詳細(xì)分析,EXPLAIN PLAN可以展示SQL執(zhí)行計劃和關(guān)鍵性能指標(biāo)如操作類型、成本、行數(shù)等,本文給大家介紹Oracle執(zhí)行計劃及性能調(diào)優(yōu)詳解使用方法,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Windows下Oracle JDK 17.0.18 安裝+環(huán)境變量配置保姆級教程

    Windows下Oracle JDK 17.0.18 安裝+環(huán)境變量配置保姆級教程

    本文基于Oracle官方JDK 17.0.18版本,整理了一套零基礎(chǔ)也能看懂的安裝+配置教程,適配Windows系統(tǒng),親測有效,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • oracle區(qū)管理和段空間管理詳細(xì)介紹

    oracle區(qū)管理和段空間管理詳細(xì)介紹

    本文將詳細(xì)介紹oracle區(qū)管理和段空間管理,需要的朋友可以參考下
    2012-11-11
  • 通過LogMiner實現(xiàn)Oracle數(shù)據(jù)庫同步遷移

    通過LogMiner實現(xiàn)Oracle數(shù)據(jù)庫同步遷移

    為了實現(xiàn)Oracle數(shù)據(jù)庫之間的數(shù)據(jù)同步,網(wǎng)上的資料比較少的時候。最好用的Oracle數(shù)據(jù)庫同步工具是:GoldenGate ,而GoldenGate是要收費的。這個時候就可以使用LogMiner來實現(xiàn)Oracle數(shù)據(jù)同步遷移,下面文章內(nèi)容將給大家介紹其實現(xiàn)方法
    2021-09-09
  • Oracle數(shù)據(jù)遷移MySQL的三種簡單方法

    Oracle數(shù)據(jù)遷移MySQL的三種簡單方法

    對于許多企業(yè)而言,遷移數(shù)據(jù)庫時最大的挑戰(zhàn)之一是如何從一個數(shù)據(jù)庫平臺順利遷移到另一個平臺,下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)遷移MySQL的三種簡單方法,需要的朋友可以參考下
    2023-06-06
  • oracle使用order by排序null值如何處理

    oracle使用order by排序null值如何處理

    oracle 對查詢結(jié)果進(jìn)行排序時,被排序的欄位存在null值,且要指定NULL值排在最前面或者最后面,本文將介紹如何處理oracle 空值排序,需要的朋友可以參考下
    2012-11-11

最新評論

建瓯市| 郓城县| 临清市| 无为县| 广灵县| 弥勒县| 九江县| 池州市| 正安县| 蓝山县| 高清| 平乐县| 承德县| 南木林县| 望城县| 河东区| 巫山县| 图木舒克市| 山西省| 屯昌县| 陕西省| 沁水县| 珠海市| 长顺县| 阿合奇县| 朝阳市| 桑植县| 泾阳县| 河南省| 比如县| 临城县| 奉化市| 安图县| 广汉市| 拉孜县| 榆社县| 南皮县| 屏边| 云林县| 朝阳县| 观塘区|