(十二)PL/SQL触发器

触发器是存储程序,它会自动执行或发射当一些事件发生。触发器,事实上,写入响应于以下任一事件将被执行:
    数据库操作(DML)语句(DELETE,INSERT,UPDATE或)
    数据库定义(DDL)语句(CREATE,ALTER或DROP)
    数据库操作(SERVERERROR,登录,注销,启动或关机)
触发器可以在表,视图,模式或数据库与该事件相关联上定义。

触发器的优点
  自动生成一些派生列值
  实施参照完整性
  事件日志和对表的访问存储信息
  审计
  表的同步复制
  实行安全许可
  防止非法交易
  
  
一、创建触发器
创建触发器的语法:
    CREATE [OR REPLACE ] TRIGGER trigger_name
    {BEFORE | AFTER | INSTEAD OF }
    {INSERT [OR] | UPDATE [OR] | DELETE}
    [OF col_name]
    ON table_name
    [REFERENCING OLD AS o NEW AS n]
    [FOR EACH ROW]
    WHEN (condition) 
    DECLARE
       Declaration-statements
    BEGIN
       Executable-statements
    EXCEPTION
       Exception-handling-statements
    END;
 那么,
   CREATE [OR REPLACE] TRIGGER trigger_name: 创建或替换现有的触发器:trigger_name
   {BEFORE | AFTER | INSTEAD OF} : 指定当触发将被执行。在INSTEAD OF子句用于在视图中创建触发器
   {INSERT [OR] | UPDATE [OR] | DELETE}: 指定DML操作
   [OF col_name]: 指定将被更新的列名
   [ON table_name]: 指定触发器相关联的表的名称
   [REFERENCING OLD AS o NEW AS n]: 可以参考新旧值的各种DML语句,如INSERT,UPDATE和DELETE
   [FOR EACH ROW]: 指定的行级触发器,即触发器将每一行受到影响执行。否则,当执行SQL语句,这被称为表级触发器触发将执行一次
   WHEN (condition): 触发器将触发的条件。此子句仅适用于行级触发器有效

示例:
首先使用CUSTOMERS表:
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
+----+----------+-----+-----------+----------+

下面的程序创建了customers表中,将触发INSERT或UPDATE或DELETE在Customers表进行操作的行级触发。触发器将显示工资的旧值和新值之间的差额:

CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
DECLARE
   sal_diff number;
BEGIN
   sal_diff := :NEW.salary  - :OLD.salary;
   dbms_output.put_line(‘Old salary: ‘ || :OLD.salary);
   dbms_output.put_line(‘New salary: ‘ || :NEW.salary);
   dbms_output.put_line(‘Salary difference: ‘ || sal_diff);
END;
/
当上述代码在SQL提示符执行时,它产生了以下结果:
Trigger created.

这里以下两点是重要的,应小心注意:
   OLD和NEW引用是不可用于表级触发器,而不可以使用它们的创纪录级别的触发器。
   如果想查询表中相同的触发,那么应用应该使用AFTER关键字,因为触发器可以查询该表,或再次改变它最初的变化仅适用后的表是回到一致的状态。
   上述触发已经写在这样一种方式,它会在任何DELETE、INSERT或UPDATE操作在表上之前执行,但可以夺触发器上编写一个或多个操作,例如BEFORE DELETE,这将会触发每当一个记录将使用在表上删除操作被删除。
 
 
 
二、触发一个触发器
让我们在CUSTOMERS表执行某些DML操作。这里有一个INSERT语句,这将在表中创建一个新的记录:
 INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, ‘Kriti‘, 22, ‘HP‘, 7500.00 );
当记录在CUSTOMERS表中创建,上面创建触发器display_salary_changes将被触发,它会显示以下结果:
   Old salary:
   New salary: 7500
   Salary difference:
因为这是一个新的记录,因此基本工资不可用及以上的结果来为空(null)。现在,让我们对CUSTOMERS表进行多一个DML操作。这里有一个UPDATE语句,该语句将更新表中现有的记录:
   UPDATE customers
   SET salary = salary + 500
   WHERE id = 2;
当记录在CUSTOMERS表更新,上面创建触发器display_salary_changes将被触发,它会显示以下结果:
   Old salary: 1500
   New salary: 2000
   Salary difference: 500

时间: 2024-11-08 22:06:44

(十二)PL/SQL触发器的相关文章

(十)PL/SQL记录

PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行.例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题,图书ID.包含一个字段为每个这些项目记录允许进行处理书籍作为一个逻辑单元信息. PL/SQL可以处理记录的以下几种类型:   基于表的记录   基于游标的记录   用户自定义记录      附:  Select * from customers;+----+----------+-----+-----------+---

Oracle学习笔记十 使用PL/SQL

PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构,可用于创建存储过程.触发器和程序包,给SQL语句的执行添加程序逻辑,与 Oracle 服务器和 Oracle 工具紧密集成,具备可移植性.灵活性和安全性. PL/SQL 的优点 支持 SQL,在 PL/SQL 中可以使用: 1.数据操纵命令 2.事务控制命令 3.游标控制 4.

PL/SQL触发器

触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 1.1触发器类型 触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT.UPDATE及DELETE操作或对视

ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行触发器中,不能用在INSTEAD OF行触发器和其它类型的触发器中. -- 创建记录操作事件的表 CREATE TABLE event_table( event VARCHAR2(50), time DATE ); -- 创建触发器 CREATE OR REPLACE TRIGGER tr_star

Oracle数据库之PL/SQL触发器

1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行.触发器经常用于加强数据的完整性约束和业务规则等. ORACLE触发器有三种类型,分别是:DML触发器.替代触发器和系统触发器. DML触发器 顾名思义,DML触发器是由DML语句触发的.例如数据库的INSERT.UPDATE.D

Oracle笔记 十、PL/SQL存储过程

--create or replace 创建或替换,如果存在就替换,不存在就创建 create or replace procedure p is cursor c is select * from dept2 for update; begin for row_record in c loop if (row_record.deptno = 30) then update dept2 set dname = substr(dname, 0, length(dname) - 3) where c

性能测试四十二:sql案例之联合索引最左前缀

联合索引:一个索引同时作用于多个字段 联合索引的最左前缀: A.B.C3个字段--联合索引 这个时候,可以使用的查询条件有:A.A+B.A+C.A+B+C,唯独不能使用B+C,即最左侧那个字段必须匹配到 联合索引最左前缀如果匹配不到,会造成索引失效,对性能影响非常大,所以联合索引的顺序很重要 看一下案例 Unique: 这种情况,单个cardNO.course.sex均允许重复,但是当这3个字段组到一起以后,就不允许任何两个重复,这里为了设计特别场景,把sex移到索引字段的最前面 接口:http

PL/SQL教程(转)

课程 一 PL/SQL 基本查询与排序 本课重点:   1.写SELECT语句进行数据库查询   2.进行数学运算   3.处理空值   4.使用别名ALIASES   5.连接列   6.在SQL PLUS中编辑缓冲,修改SQL SCRIPTS   7.ORDER BY进行排序输出.   8.使用WHERE 字段. 一.写SQL 命令:     不区分大小写.     SQL 语句用数字分行,在SQL PLUS中被称为缓冲区.     最后以:或 / 结束语句.     也可以用RUN来执行语

2015/8/17笔记整理 第12章 PL/SQL编程简介1 块 过程 函数

Oracle数据库中包含一种过程化编程语言PL/SQL,PL/SQL是ORACLE对标准数据库语言的扩展. 一.PL/SQL的优点 PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块.当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句. PL/SQL语句—