Oracle触发器介绍 语句级触发器

DML触发器的创建 行级 DML 触发器必须加入 FOR EACH ROW 子句,和语句级 DML触发器不一样,行级 DML 触发器在每次执行 DML操作的时候,如果操作一条记录,触发器就执行一次,如果涉及多条记录,那么触发器就执行多次。如果触发操作时,在UPDATE情况下,:OLD标识符指更新前的记录,:NEW标识符指更新后的记录如果触发操作时,在 DELETE 情况下,:OLD 标识符指被删除前的记录,而:NEW 标识符没有定义。为 emp 数据表创建一个触发器,当插入新员工的时候,显示新员工的工号和姓名; 阅读详情

语句级触发器
我们先看一个AFTER-INSERT-STATEMENT触发器:
CREATE OR REPLACE TRIGGER temp_ais
AFTER INSERT ON TEMP
BEGIN
    dbms_output.put_line('executing temp_ais');
END;
看一下下面语句的结果:
SQL> set feedback off
SQL> INSERT INTO temp VALUES (1);          -- insert 1 row
executing temp_ais
SQL> INSERT INTO temp VALUES (1);          -- insert 1 row
executing temp_ais
SQL> INSERT INTO temp SELECT * FROM temp;  -- insert 2 rows
executing temp_ais

每个SQL插入语句将触发一次,行级触发器最后一条语句要触发两次。
一、事件顺序
用Insert 语句级触发器可以做:
    ·可以在表上执行一个合计运算,可以在insert前或后来计算。
    ·可以使用语句级触发器去处理行级触发器控制的数据。
    ·可以给事件发信号。可以仅仅是一个打印语句。也可以是一个email或使用DBMS_ALERT包向其他处理过程发送信号。
                                                                                                  Tasks Performed
                                          Stages                                          -------------------
                               ----------------------------------  ———>   |   Rehect the     |
Fires once          |   BIS function                     |                   |   Transaction    |
per statement    | Statement Level Trigger |                     -------------------
                              ----------------------------------- ———>     -------------------
                                          |                                                      |  Take Action     |
                                          |                                                       -------------------
   insert                            |
   3行记录        |    --------------------------                   |    
     ————>  |    |    Row Trigger       |                  |    -------------------------------
     ————>  |    --------------------------                   |    |每一个行触发器插入一|
     ————>  |                |                                         |    |行触发一次,插入三行|
                         |  ----------------------------------------   |    |触发三次,语句级触发|
                         |  | Oracle enforces constraints |  |    |器在行操作和行数据上|
                         |  ----------------------------------------   |    |不可见                            |
                         |                |                                         |    |                                         |
                         |    --------------------------                    |    -------------------------------
                         |    |    Row Trigger          |                |    
                         |    --------------------------                    |        
                                         |
                                         |                                                         ----------------------
                               ----------------------------------  ————>  |   Rehect the     |
Fires once          |   AIS function                     |                      |   Transaction   |
per statement    | Statement Level Trigger |                       ---------------------
                              ----------------------------------  ————>   --------------------
                                                                                                   |  Take Action  |
                                                                                                   --------------------  

上图显示了语句级出发器的行为。同时也显示了在Before statement触发器和After statement触发器间的行级触发器的触发情况。如果一个update SQL语句更新三行,那么行级触发器触发三次,语句级触发器触发一次。

二、insert 语句级触发器定义语法
语法如下:
CREATE OR REPLACE TRIGGER trigger_name
[AFTER | BEFORE] INSERT ON table_name
DECLARE
    Local declarations
BEGIN
    Body written PL/SQL
END;

语句级和行级触发器在语法上关键的不同在于:FOR EACH ROW字句。在行级触发器中指定这个子句而语句级触发器中不需要指定。

 1)、WHEN(Boolean expression)  所有行触发器可用
 2)、OF column_name clause     仅对update触发器可用
在语句级触发器中:
 ·引用:NEW.COLUMN_NAME and :OLD.COLUMN_NAME是不正确的。
 ·不能使用When(boolean expression)子句中包含OLD.COLUMN_NAME和 NEW.COLUMN_NAME.

可以使用下面的语句:
 CREATE OR REPLACE TRIGGER temp_biuds
 BEFORE INSERT OR UPDATE OR DELETE ON TEMP
 BEGIN
     CASE
     WHEN inserting THEN
         PL/SQL code here
     WHEN updating THEN
         PL/SQL code here
     WHEN deleting THEN
         PL/SQL code here
     END CASE;
 END;
三、语句级组合

   ·使用错误码来更新Errors包
   ·包商业规则逻辑放到一个约束包中
   ·编写before或after语句级触发器
  
  1)、第一步是声明错误码和错误信息。Errors包更新包含了-20002和-2003两个错误码
 CREATE OR REPLACE PACKAGE errors IS
     eng_dept_sal CONSTANT PLS_INTEGER := -20001;
     app_error_02 CONSTANT PLS_INTEGER := -20002;
     app_error_03 CONSTANT PLS_INTEGER := -20003;
 
     eng_dept_sal_txt CONSTANT VARCHAR2(100) :=
     'The salary exceeds the ENGL maximum of $10,000.00';
 
     app_error_02_txt CONSTANT VARCHAR2(100) :=
     'No additions if the budget exceeds $55,000.00';
 
     app_error_03_txt CONSTANT VARCHAR2(100) :=
     'Budget cannot be over $60,000.00';
 END errors;
  2)、把商业逻辑封装在约束包中。
    CREATE OR REPLACE PACKAGE professors_cons IS
     PROCEDURE constrain_budget
         (limit NUMBER,err_code PLS_INTEGER,err_text
         VARCHAR2);
 END professors_cons;
 
 CREATE OR REPLACE PACKAGE BODY professors_cons IS
     PROCEDURE constrain_budget
         (limit NUMBER,err_code PLS_INTEGER,err_text
         VARCHAR2)
     IS
         budget_sum NUMBER;
     BEGIN
         SELECT SUM(salary) INTO budget_sum FROM
         professors;
         IF budget_sum > limit THEN
             RAISE_APPLICATION_ERROR(err_code, err_text);
         END IF;
     END constrain_budget;
 END professors_cons;
  3)、定义before和after触发器
    CREATE OR REPLACE TRIGGER professors_bis
 BEFORE INSERT OR UPDATE ON professors
 BEGIN
     professors_cons.constrain_budget
         (55000, errors.budget_err_1,
         errors.budget_err_1_txt);
 END;
 
 CREATE OR REPLACE TRIGGER professors_ais
 AFTER INSERT OR UPDATE ON professors
 BEGIN
     professors_cons.constrain_budget
         (60000, errors.budget_err_2,
         errors.budget_err_2_txt);
 END;

四、处理行获得的数据
行级触发器可以在全局临时表中存储:OLD 和 :NEW 字段值。全局临时表范围仅是事务。通过复制:OLD 和 :NEW 值,商业规则的处理被延期到语句级触发器上。有时是必须的,因为商业规则是复杂的,需要从表中查询,包括表被更新。
1)、首先需要一个全局临时表,它在行级触发器上用于存储数据。
CREATE global temporary TABLE professors_g
 (prof_name     VARCHAR2(10),
  specialty     VARCHAR2(20),
  hire_date     DATE,
  salary        NUMBER(7,2),
  tenure        VARCHAR2(3),
  department    VARCHAR2(10)) ON COMMIT DELETE ROWS;
2)、为这张表编写存储过程,放于包Professors_cons里.如下:
CREATE OR REPLACE PACKAGE professors_cons IS
    PROCEDURE load_temp_table
        (v_prof_name  professors.prof_name%TYPE,
         v_specialty  professors.specialty%TYPE,
         v_hire_date  professors.hire_date%TYPE,
         v_salary     professors.salary%TYPE,
         v_tenure     professors.tenure%TYPE,
         v_department professors.department%TYPE);

    PROCEDURE dump_temp_table;

END professors_cons;
包体为:
CREATE OR REPLACE PACKAGE BODY professors_cons IS

    PROCEDURE load_temp_table
        (v_prof_name  professors.prof_name%TYPE,
         v_specialty  professors.specialty%TYPE,
         v_hire_date  professors.hire_date%TYPE,
         v_salary     professors.salary%TYPE,
         v_tenure     professors.tenure%TYPE,
         v_department professors.department%TYPE)
    IS
    BEGIN
        INSERT INTO professors_g VALUES
            (v_prof_name, v_specialty, v_hire_date,
             v_salary, v_tenure, v_department);
    END load_temp_table;

    PROCEDURE dump_temp_table IS
    BEGIN
        FOR rec in (SELECT * FROM professors_g) LOOP
            dbms_output.put_line(
                rec.prof_name||' '||rec.specialty||' '||
                rec.hire_date||' '||rec.salary||' '||
                rec.tenure||' '||rec.department);
        END LOOP;
    END dump_temp_table;
END professors_cons;

3)、下面是一个after delete 行触发器。当它触发时,通过Professors_cons插入临时表一行数据。
CREATE OR REPLACE TRIGGER professors_adr
AFTER DELETE ON professors
FOR EACH ROW
BEGIN
    professors_cons.load_temp_table
        (:old.prof_name, :old.specialty, :old.hire_date,
         :old.salary, :old.tenure, :old.department);
END;

下一个是after delete语句级触发器,使用约束包打印删除的行信息。
CREATE OR REPLACE TRIGGER professors_ads
AFTER DELETE ON professors
BEGIN
    professors_cons.dump_temp_table;
END;

delete SQL语句后面是语句级触发器的输出:

SQL> DELETE FROM professors;

Blake Mathematics 08-aug-2003 02:06:27 10000 YES MATH
Milton Am Hist 09-aug-2003 02:06:27 10000 YES HIST
Wilson English 06-aug-2003 02:06:27 10000 YES ENGL
Jones Euro Hist 12-jul-2003 02:06:28 10000 YES HIST
Crump Ancient Hist 12-jul-2003 02:06:28 10000 YES HIST

5 rows deleted.

 

 

 

《Oracle PL/SQL编程指南》10-02:创建触发器 语句级触发器和行级触发器。 阅读详情

相关推荐

具身智能中的运动控制如何入门?

本文提出计算机视觉(CV)与强化学习(RL)结合的机器人运动控制学习路径。强调工程实践导向,建议采用"算法-机器人-工程"三阶段学习法:基础阶段掌握RL核心算法(PPO/SAC)和机器人动力学;进阶阶段聚焦Sim2Real技术(域随机化、模仿学习)和仿真环境搭建;深耕阶段结合CV优势开发视觉闭环控制等创新方向。特别指出应避免纯理论学习,提倡"最小知识原则"的实践模式,通过具体项目(如四足机器人控制)串联知识体系。推荐以《现代机器人学》等工具书为参考,配合开源框架(Pi

CyberSoma的博客 321

Oracle中的触发器

Oracle中的触发器

m0_71406734的博客 1万+

《基于Yolo算法的火灾检测系统设计与实现》开题报告

在消防安全领域,火灾对生命财产安全构成严重威胁。传统的火灾检测手段存在诸多不足,如误报率高、检测范围有限、响应速度慢等。基于 Yolo 算法的火灾检测系统能够利用深度学习技术,实现对火灾的高效、精准检测,具有重要的现实意义。         从社会安全角度看,该系统可以广泛应用于各类公共场所、工业厂房和居民住宅,实时监测火灾隐患,及时发出警报,为人员疏散和消防救援争取宝贵时间,有效降低火灾造成的人员伤亡和财产损失,保障社会公共安全。

m0_69704149的博客 1384

Oracle 触发器详解

可以在触发器体的语句块中使用 inserting、updating、deleting谓词,这些谓词会返回相应的DML操作的布尔值,如果为true,则表示执行了相应的insert、update、delete操作。new谓词:执行后的字段的值的名称,比如update一个表时,使用:new.columnname是指执行 update操作之后的列的值。old谓词:执行前的字段的值的名称,比如update一个表时,使用:old.columnname是指执行update操作之前的列的值。

KevinChen2019的博客 1万+

Cadence17.2 > OrCAD Capture CIS > 设计规则检查(Design Rule Check)DRC学习记录详解

选中设计完成的DSN文件,选择Tool->Design Rule Check,弹出下面对话框,详解如下。 一、Design Rule Check对话框选项详解 Design Rules Options tab Set the scope, mode and type of design rule (electrical and / or physical) test options for the design rules check. 为

DL_62532的专栏 1万+

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

搭建仿真的环境,导入VEINS和INET开源库,使用INET库中提供的网络协议和功能模型来模拟通信协议和网络功能,使用SUMO创建道路网络和车辆轨迹,并导出到OMNeT++中 在OMNeT++中使用VEINS通过socket和SUMO连接,借助VEINS实现的TRACI接口来设置车辆相关的行为和场景,最后在OMNET++中结合VEINS,SUMO和INET运行联合仿真实验,并分析车辆在遇到紧急情况下的通信状况和具体行为

mjmmm的博客 1万+

Oracle系列十四:触发器

触发器(trigger)是一种数据库对象,当一个特定的事件发生时,会自动执行在数据库表上的某些操作。本文详细介绍了Oracle触发器的基础概念、语法和使用方法。

聚集机器学习、信息安全 6750

QKD(量子密钥分发)

量子密钥分发(Quantum Key Distribution,QKD)是一种基于量子力学原理的安全通信协议,它允许两个用户通过不安全的通信信道创建并共享一个安全的密钥。这个密钥随后可以用于加密和解密信息,确保通信的机密性。QKD的核心原理是量子不可克隆定理和量子测量的不确定性。

qq_40844444的博客 2896

Oracle 触发器详解(trigger)

Oracle 触发器详解(trigger)

鱼丸丶粗面 8566

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架可以类比为编程语言,仅为我们实现项目效果的工具,也就是我们造车使用的轮子,我们重点需要的是理解如何使用Torch去实现功能而不要过度在意轮子是要怎么做出来的,那样会牵扯我们太多学习时间。以后就出一系列专门细解深度学习框架的文章,但是那是较后期我们对深度学习的理论知识和实践操作都比较熟悉才好开始学习,现阶段我们最需要的是学会如何使用这些工具。

master_hunter的博客 8935

addr2line解析不出来行号的解决方式(汇编解析高阶版)

摘要:本文针对AEC crash问题中addr2line无法解析行号的情况,通过llvm-addr2line和反汇编分析,定位到CamX::AECBEStats17::AdjustROIParams函数中的乘法溢出问题。关键发现包括: 常规addr2line只能解析到函数名但无具体行号 llvm-addr2line解析出多个可能溢出点(行196/204/211/218/270/271) 反汇编显示6个条件分支跳转到溢出处理函数 源码分析确认这些位置均存在乘法运算 最终通过汇编级调试工具成功定位UBsan报告

168

Oracle触发器

数据库触发器是一个与表相关联、存储PL/SQL语句的“东西”。每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列(当 '触发条件' 成立时,其语句就会 '自动执行' )触发器分类:DML触发器、DDL触发器、Databse触发器、instead of 替代触发器(参考2有详解)作用: 保护数据的安全,监视对数据的各种操作,如'日志记录': 对重要表的 '修改' 进行记录例如:当员工信息插入后,自动输出“插入成功”的信息。

qq_62687015的博客 4887

C/C++小宇宙代码(完整代码)

C语言实现小宇宙的完整代码。

AIGC 2523

oracle中触发器写判断语句,Oracle触发器介绍 语句级触发器

语句级触发器我们先看一个AFTER-INSERT-STATEMENT触发器:CREATE OR REPLACE TRIGGER temp_aisAFTER INSERT ON TEMPBEGINdbms_output.put_line(‘executing temp_ais‘);END;看一下下面语句的结果:SQL> set feedback offSQL> INSERT INTO t...

weixin_30954817的博客 1166

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

oracle中触发器sql语句,Oracle触发器介绍 语句级触发器

语句级触发器我们先看一个AFTER-INSERT-STATEMENT触发器:CREATE OR REPLACE TRIGGER temp_aisAFTER INSERT ON TEMPBEGINdbms_output.put_line('executing temp_ais');END;看一下下面语句的结果:SQL> set feedback offSQL> INSERT INTO t...

weixin_27442001的博客 825

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

oracle触发器列级触发,Oracle触发器介绍 语句级触发器

语句级触发器我们先看一个AFTER-INSERT-STATEMENT触发器:CREATE OR REPLACE TRIGGER temp_aisAFTER INSERT ON TEMPBEGINdbms_output.put_line('executing temp_ais');END;看一下下面语句的结果:SQL> set feedback offSQL> INSERT INTO t...

weixin_35343788的博客 409

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Oracle-函数-语句级触发器-行级触发器

文章目录函数定义的格式触发器的定义格式 函数定义的格式 create or replace function 函数名 (参数名 参数类型,…) return datatype is 局部变量 begin 函数体 return 返回值 end 函数名; 触发器的定义格式 触发器往往涉及两个操作/事件,一个主动引发,一个被动自动执行 create or replace trigger 触发器名 before/after --触发时间 insert/update/delete --触发事件(通常是对数据中的表

唐傘皮 731

触发器(一、语句级和行级的区别及使用场景)

Oracle触发器分为语句级(STATEMENT)和行级(ROW)两种,从字面意思上理解,语句级触发器是指一条SQL语句触发一次;行级触发器是指一条SQL语句影响的每一行触发一次。看个案例就很明显了先建2张测试表from_table和to_table,from_table插入5条记录接着在to_table上建2个触发器,分别是语句级和行级,其中行级触发器有for each row的声明下面执行一条...

观想的专栏 1万+

Oracle 触发器trigger介绍

Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码器。触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等。

Ruishine的博客 4903

oracle触发器的基本语法使用介绍

自己本来想研究一下触发器,然后就根据网上的内容进行了学习,并发下一自己的感想! 一、触发器 触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用。 触发器分为两类: 一种是系统触发器:由系统事件触发的PL/SQL,比如登陆oracle数据库,登出oracle。 另一种是DML触发器:由DML语句触发的PL/SQL,比如INSERT、UPDATE、DELETE等。 我们一般用到的是DML触发器,所以我们接下来就介绍一下这种触发器: DML触发器: 让我们先建两张

lazybad的博客 3006

Oracle触发器及使用举例(几种触发器类型)

Oracle触发器及使用举例(几种触发器类型)

牛尚小的博客 1万+

Oracle 触发器的使用(带案例详解)

建表插数据 --创建学生信息表 create table stuInfo ( stuNo varchar2(6), stuName varchar2(10), stuSex varchar2(2), stuAge int, stuSeat int, strAddress varchar2(255) ) go --创建学生成绩表 create table stuMarks ( ExamNo varchar2(7), stuNo varchar2(6), writtenExam int

小宝的宝呢的博客 1万+

Oracle数据库 触发器

文章目录一、触发器的定义二、触发器的分类三、触发器的功能四、触发器的语法五、触发器的使用案例案例1:向emp1表中插入一条数据后输出 欢迎加入 语句案例2:数据校验,在周四这一天不允许向emp1表中插入/更新数据案例3:创建触发器,记录表的删除数据案例4:创建触发器,记录表的更新数据案例5:创建触发器,在删除某条数据之前先在记录表插入该条数据 一、触发器的定义 触发器:当某个条件成立的时候,触发器中所定义的语句就会被自动执行。 二、触发器的分类 触发器分为语句级触发器和行级触发器。 语句级触发器:在某些语句

小曹同学的博客 4280
上一篇: PMP九个领域知识
下一篇: PL/SQL环境
stevene
博客等级 码龄24年 20粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值