ORACLE PL/SQL 触发器编程篇介绍
更新时间:2012年11月14日 15:12:22 作者:
ORACLE PL/SQL 触发器能够完成由数据库的完整性约束难以完成的复杂业务规则的约束;监视数据库的各种操作以及实现审计功能
1.基本概念
两种功能:完成由数据库的完整性约束难以完成的复杂业务规则的约束;监视数据库的各种操作,实现审计功能。
触发器分为:DML触发器(对表或视图执行DML操作时触发),INSTEAD OF触发器(只定义在视图上,替代实际的操作语句),系统触发器(对数据库系统进行操作时触发,如DDL语句、启动或关闭数据库等)
触发事件: 上述触发器中括号内容都是触发事件。
触发条件: WHEN子句
触发对象:包括表、视图、模式、数据库。
触发操作:触发器自动执行的程序。
触发时机:触发器相对操作执行的时间,BEFORE/AFTER
条件谓词:INSERTING(触发器事件为INSERT时为真),UPDATING,DELETING
触发子类型:行触发和语句触发,触发中的new和old表。
2.创建触发器
CREATE OR REPLACE TRIGGER<触发器名>
触发条件
触发体
CREATE TRIGGER my_trigger --定义一个触发器my—trigger
BEFORE INSERT or UPDATE of TID,TNAME on TEACHERS
FOR each row
WHEN(new.TNAME='David') --这一部分是触发条件
DECLARE --下面这一部分是触发体
teacher_id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id
FROM TEACHERS
WHERE TNAME=new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION --异常处理也可用在这里
WHEN INSERT_EXIST_TEACHER THEN
INSERT INTO ERROR(TID,ERR)
VALUES(teacher_id,'the teacher already exists!');
END my triqqer;
3.执行触发器
自动执行
CREATE TRIGGER my_trigger1
AFTER INSERT or UPDATE or DELETE on TEACHERS
FOR each row;
DECLARE
info CHAR(10);
BEGIN
IF inserting THEN --如果进行插入操作
info:='INSERT';
ELSIF updating THEN --如果进行修改操作
info:='Update';
ELSE--如果进行删除操作
info:='Delete';
END IF;
INSERT INTO SQL_INFO VALUES(info); --记录这次操作信息
END my_trigger1;
4.删除触发器
DROP TRIGGER my_trigger;
两种功能:完成由数据库的完整性约束难以完成的复杂业务规则的约束;监视数据库的各种操作,实现审计功能。
触发器分为:DML触发器(对表或视图执行DML操作时触发),INSTEAD OF触发器(只定义在视图上,替代实际的操作语句),系统触发器(对数据库系统进行操作时触发,如DDL语句、启动或关闭数据库等)
触发事件: 上述触发器中括号内容都是触发事件。
触发条件: WHEN子句
触发对象:包括表、视图、模式、数据库。
触发操作:触发器自动执行的程序。
触发时机:触发器相对操作执行的时间,BEFORE/AFTER
条件谓词:INSERTING(触发器事件为INSERT时为真),UPDATING,DELETING
触发子类型:行触发和语句触发,触发中的new和old表。
2.创建触发器
复制代码 代码如下:
CREATE OR REPLACE TRIGGER<触发器名>
触发条件
触发体
复制代码 代码如下:
CREATE TRIGGER my_trigger --定义一个触发器my—trigger
BEFORE INSERT or UPDATE of TID,TNAME on TEACHERS
FOR each row
WHEN(new.TNAME='David') --这一部分是触发条件
DECLARE --下面这一部分是触发体
teacher_id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id
FROM TEACHERS
WHERE TNAME=new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION --异常处理也可用在这里
WHEN INSERT_EXIST_TEACHER THEN
INSERT INTO ERROR(TID,ERR)
VALUES(teacher_id,'the teacher already exists!');
END my triqqer;
3.执行触发器
自动执行
复制代码 代码如下:
CREATE TRIGGER my_trigger1
AFTER INSERT or UPDATE or DELETE on TEACHERS
FOR each row;
DECLARE
info CHAR(10);
BEGIN
IF inserting THEN --如果进行插入操作
info:='INSERT';
ELSIF updating THEN --如果进行修改操作
info:='Update';
ELSE--如果进行删除操作
info:='Delete';
END IF;
INSERT INTO SQL_INFO VALUES(info); --记录这次操作信息
END my_trigger1;
4.删除触发器
复制代码 代码如下:
DROP TRIGGER my_trigger;
您可能感兴趣的文章:
相关文章
oracle 动态AdvStringGrid完美示例 (AdvStringGrid使用技巧/Cells)
本方法实现用常量和常量数组完美创建和控制动态TAdvStringGrid。2009-06-06oracle下巧用bulk collect实现cursor批量fetch的sql语句
oracle下巧用bulk collect实现cursor批量fetch的sql语句,使用oracel的朋友可以试试了2008-03-03Oracle动态视图v$active_session_history实战示例
这篇文章主要为大家介绍了Oracle动态视图v$active_session_history实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-03-03
最新评论