`

Oracle 10g触发器学习一

阅读更多
可能不是很多人知道 RAISE_APPLICATION_ERROR 的用途是什么,虽然从字面上已经猜到这个函数是干什么用的。平时用来测试的异常处理
我们都是通过dbms_output.put_line来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。
其实 RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)
RAISE_APPLICATION_ERROR 的声明:
PROCEDURE RAISE_APPLICATION_ERROR( error_number_in IN NUMBER, error_msg_in IN VARCHAR2);

里面的错误代码和内容,都是自定义的。说明是自定义,当然就不是系统中已经命名存在的错误类别,是属于一种自定义事务错误类型,才调用此函数。error_number_in 之容许从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突。error_msg_in 的长度不能超过 2k,否则截取 2k。


触发器是指存放在数据库中,并被隐藏执行的存储过程。在Oracle8i之前,只允许基于表或视图的DML操作(insert,update,delete)建立触发器,在oracle8i之后,不仅支持DML操作,也允许基于系统事件(启动数据库,关闭数据库,登录)和DDL操作建立触发器。
一、触发器简介
   触发器是指隐含执行的存储过程,它可以使用PL/SQL,java和C进行开发,当发生特定事件(例如:修改表、建立对象、登录数据库)时,Oracle会自动执行触发器的相应代码。
触发器由触发事件、触发条件和触发操作三部分组成。
1、触发事件
触发事件是指触发器被触发的SQL、数据库事件和用户事件,在oracle8i之前,触发事件只能是DML操作,在oracle8i之后,不仅支持DML事件,而且还增加了其他事件,具体事件如下:

启动和关闭例程
Oracle错误信息
用户登陆和关闭会话
特定表和视图的DML操作
DDL语句

2、触发条件(可选)
触发条件是指使用when子句指定一个boolean表达式,当表达式返回true时,则执行触发器相应代码,如果表达式返回false或unknown,则不会执行触发器相应代码。
3、触发操作
触发操作是指包含SQL语句和其他执行代码的PL/SQL块,不仅可以使用PL/SQL开发,也可以使用java或c语言开发,当触发条件为true时,会自动执行触发操作的相应代码。但是在编写触发器执行代码时,需要注意一下限制:

触发代码大小不能超过32k,如果确实需要使用大量代码建立触发器,应该首先建立存储过程,然后在触发器中使用call语句调用存储过程。
触发器代码只能包括insert、update和delete语句,而不能包括DDL语句(create、drop、alert)和事务控制语句(commit,rollback和savepoint)。

二、建立DML触发器
    当建立DML触发器时,需要指定触发时机(before和after)、触发事件(insert、select、update、delete)、表名、触发类型、触发条件以及触发操作。
1、触发时机
  触发时机是指触发器的触发时间,当指定before关键字时,表示在执行DML操作之前触发触发器;当指定after关键字时,表示在执行DML操作之后触发触发器。
2、触发事件
触发条件是指被引起触发器执行的DML语句,即insert、update、delete操作。即可以使用单个触发事件,也可以组合多个触发事件。
3、表名
因为DML触发器是针对特定表执行的,所以必须指定DML操作所对应的表名。
4、触发类型
触发类型用于指定当触发事件发生后,需要执行几次触发操作,如果指定语句触发类型(默认),则只会执行一次触发器代码,如果指定行触发器,则会在每个被作用行上执行一次触发器。
5、触发条件
触发条件用于指定执行触发器代码的条件,只有当条件为true时,才会执行触发器代码,当编写DML触发器时,只能在行触发器上执行触发条件。
6、触发操作
触发操作用于指定触发器执行的代码,如果使用PL/SQL存储过程、java存储过程或外部存储过程,则在触发操作中使用call语句调用相应过程。如果使用PL/SQL匿名块编写触发操作,则按照以下格式编写。
[declare]
  定义变量、常量等。
begin
  编写SQL语句或PL/SQL块。
exception
  编写例外处理语句。
end;
7、DML触发器触发顺序
(1)、DML触发器在单行数据上执行顺序
    对于单行数据而言,无论是语句触发器、还是行触发器,都执行一次,并且执行顺序是
    before语句触发器、before行触发器、DML操作,after行触发器、after语句触发器。
(2)、DML触发器在多行数据上执行顺序
   对于多行数据而言,语句触发器只执行一次,而行触发器则在每个作用行上都执行一次。
三、语句触发器
语句触发器是当执行DML语句时被隐含执行的触发器。注意语句触发器时,不能记录列数据的变化。建立语句触发器的语法如下:

Oracle代码
create or replace trigger trigger_name    
   timing event1[or event2 or event3]   
 on table_name   
pl/sql block;
 

如上所示:trigger_name用于指定触发器名称,timing用于指定触发时机(before和after),event1用于指定指定触发事件(insert、update、delete),table_name用于指定DML操作对应的表名。
1、建立before语句触发器
   为了禁止工作人员在休息日改变雇员信息,可以建立before语句触发器,以实现数据的安全保护,示例如下:

Oracle代码
create or replace trigger trigger_before   
before insert or update or delete on cip_tmps   
begin   
     if to_char(sysdate,'DY','nls_date_language=AMERICAN')   
      IN ('STA','SUN','THU','WED') then   
      raise_application_error(-20001,'不能在周末修改数据');   
      end if;   
end; 


  2、使用条件谓词
当在触发器中同时包含多个触发时间(insert、update、delete),为了在触发器代码中区分具体的触发事件、可以使用以下三个条件谓词:

INSERTING:当触发条件是insert操作时,该条件谓词返回值为true,否则返回值为false。
UPDATING:当触发条件是update操作时,该条件谓词返回值为true,否则返回值为false。
DELETING:当触发条件是delete操作时,该条件谓词返回值为true,否则返回值为false。

下面示例说明在触发器中使用这三个条件谓词的方法,示例如下:

Oracle代码
create or replace trigger forbidden_update_comtype
before insert or update or delete on communitytype
begin
case
when inserting then
raise_application_error(-20091,'不能执行增操作');
when deleting then
raise_application_error(-20092,'不能执行删操作');
when updating then
raise_application_error(-20093,'不能执行改操作');
end case;
end;

update communitytype com
set com.english_name = 'test'
where com.community_type_id = 'ebook' 


3、建立after语句触发器
在往cip_temp表中插入数据时,同时往cip_temps表中插入数据,必备条件是,cip_temp表中必须有一个字段标示是最后插入的那条记录。

Oracle代码
create or replace trigger trigger_after   
after insert on cip_temp   
begin   
insert into cip_temps (select * from(select * from cip_temp order by id) where rownum=1);   
end;  


四、建立行触发器
行触发器是指执行DML操作时,每作用一行就触发一次触发器。建立行触发器语法如下:

Oracle代码
create or replace trigger trigger_name    
   timing event1[or event2 or event3]   
 on table_name   
[REFERENCING NEW AS NEW | OLD AS OLD]   
for each row   
pl/sql block;
 

如上所示:trigger_name用于指定触发器名称,timing用于指定触发时机(before和after),event1用于指定指定触发事件(insert、update、delete),table_name用于指定DML操作对应的表名。REFERENCING 子句用于指定引用新、旧、数据方式,默认情况下使用old修饰符引用旧数据,使用new修饰符是引用新数据。for each row表示建立行触发器。
1、建立before行触发器
确保员工工资不能涨价,示例如下:

Oracle代码
create or replace trigger trigger_before_row   
before update of english_name on communitytype   
for each row   
begin   
  if(:new.english_name =:old.english_name) then   
  raise_application_error(-20001,'资源库名称没有变化');   
  end if;   
end;

update communitytype com
set com.english_name = com.english_name
where com.community_type_id = 'ebook'
 

2、建立after行触发器
做到更新、删除、添加一个表中的数据,则另一个表也相应的更新、删除、添加。

Oracle代码
create or replace trigger trigger_after_row   
after insert or update or delete on cip_test   
for each row   
declare   
v_update int;   
v_delete int;   
begin   
case    
  when inserting then   
    insert into cip_temps values(:new.name,:new.age,:new.address,:new.id);   
  when updating then   
      select count(1) into v_update from cip_temps where id=:old.id;   
      if(v_update=0) then   
      insert into cip_temps values(:new.name,:new.age,:new.address,:new.id);   
      else   
            update cip_temps set name=:new.name,age=:new.age,address=:new.address    
            where id=:old.id;   
      end if;   
  when deleting then   
    select count(*) into v_delete from cip_temps where id=:old.id;   
    if(v_delete<>0)then   
     delete from cip_temps where id=:old.id;   
    end if;   
   end case;      
end;
 

3、限制行触发器
当使用行触发器时,默认情况下会作用在每行执行一次触发器,为了在特定条件下执行行触发器代码,就需要使用when子句对触发条件加以限制。
示例如下:

Oracle代码
create or replace trigger trigger_after_row_when   
after  update or delete on cip_test   
for each row   
when (old.name='aa8')   
declare   
v_update int;   
begin   
case    
  when updating then   
      select count(*) into v_update from cip_temps where id=:old.id;   
    if(v_update=0) then   
     insert into cip_temps values(:new.name,:new.age,:new.address,:new.id);   
    else   
update cip_temps set name=:new.name,age=:new.age,address=:new.address where id=:old.id;   
    end if;   
   end case;      
end; 


4、DML触发器使用注意事项
当编写DML触发器时,触发器代码不能从触发器所对应的表中读取数据。
5、实现参照完整性
参照完整性是指两个表具有主从关系(主外健关系),当删除主表数据时,必须确保相应的从表的数据也被删除,可以在定义外键约束时指定on delete cascade。
五、行触发器和语句触发器区别
1、行触发器有 for each row子句。语句触发器没有for each row 子句。
2、行触发器,可以有 when 作为触发限制,可以使用new/old。语句触发器不能有when 作为触发限制。
3、行触发器:对应DML语句所影响到的表中的每一行,触发器都要执行一遍。
4、语句触发:对应DML语句所影响到的表中的所有行,触发器只执行一遍。
对表进行行级触发的,则该表暂时不能操作(即该表已经成为变异表)表 级触发器与此不同
分享到:
评论

相关推荐

    Oracle 10g 学习笔记

    │ oracle10g系统管理之表空间(一) - lvhuiqing的专栏 - CSDN博客.mht.lnk │ oracle10g系统管理之表管理 - lvhuiqing的专栏 - CSDN博客.mht │ oracle10g系统管理之表管理 - lvhuiqing的专栏 - CSDN博客.mht.lnk ...

    oracle database 10g 完整参考手册part1

    第1章 Oracle Database 10g体系结构 第2章 安装Oracle Database 10g和创建数据库 第3章 升级到Oracle Database 10g 第4章 规划Oracle应用程序——方法、风险和标准 第Ⅱ部分 SQL和SQL*Plus 第5章 SQL中的基本语法 第...

    Oracle 11g完全学习手册光盘代码

    《Oracle完全学习手册》作为世界范围内性能最优异的数据库系统之一,它在国内数据库市场的占有率远远超过其对手,始终处于数据库领域的领先地位。《Oracle完全学习手册》以Oracle 11g for Windows XP为平台,...

    Oracle11g从入门到精通2

    对于初学者,《Oracle11g从入门到精通》是一本很好的入门教程,对Oracle管理员和应用程序开发员,也有很好的学习和参考价值。  Oracle数据库系统是数据库领域最优秀的数据库之一,《Oracle11g从入门到精通》以...

    Oracle 10g Concepts 中文版

    oracle官方的学习资料,中英文对照 目录如下: 第一部分 何为 Oracle? Chapter 1, Introduction to the Oracle Database 第 1 章,Oracle 数据库简介 Part II Oracle Database Architecture 第二部分 Oracle ...

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    第1章-Oracle 11g数据库简介 认识Oracle 11g 回忆Oracle的产品版本 学习Oracle 11g的新特性 第2章-Oracle 11g的安装与测试 能够使用Oracle 11g的基本条件 在Windows 2003上安装Oracle 11g 移除Oracle 11g ...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

     第1章 在windows 平台上安装oracle database 11g  第2章 配置网络服务名  第3章 使用sql database  第4章 使用sql*plus 第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 ...

    Oracle Database 11g完全参考手册中文版.part1

    通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 ...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

    《Oracle11g宝典》共分19章,第1~4章分别介绍了Oracle11g的下载和安装、SQL*Plus的使用、SQ语言与PL/SQL.程序设计,第5~9章分别介绍了Oracle11g的体系结构、表空间与数据文件的管理、启动和关闭数据库、网络服务...

    Oracle完全学习手册电子书.part1.rar

    《Oracle完全学习手册》作为世界范围内性能最优异的数据库系统之一,它在国内数据库市场的占有率远远超过其对手,始终处于数据库领域的领先地位。《Oracle完全学习手册》以Oracle 11g for Windows XP为平台,...

    Oracle 10g应用指导

    Oracle是当今各领域中应用比较广泛的一个大型关系型数据库产品,它以其所拥有的稳定、可伸缩性强以及安全可靠等特性受到越来越多的系统开发人员的青睐,正成为企业开发信息系统的首选产品。同其他数据库管理系统相比...

    Oracle 10g r2 Concepts 手册(中英文对照阅读版本).chm

    Oracle 10g r2 Concepts 手册是一个很好的学习 Oracle 的起点,涉及到了你所需要知道的许多重要 Oracle 概念。当然,其中不可能会涵盖每一个技术细节(Oracle 文档提供了技术细节,不过它有 10000 ~ 20000 页),...

    Oracle数据库精讲之数据库管理_ Oracle数据库管理视频

    第十一讲:oracle tablespace管理 第十二讲:oracle table管理 第十三讲:oracle index管理 第十四讲:oracle Partitioned Tables and Indexes管理 第十五讲:oracle view管理 第十六讲:oracle sequences管理 第十...

    oracle 11g从入门到精通

    Oracle的操作和plsql,函数触发器等内容,从基础开始学习Oracle

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     第1章 在windows 平台上安装oracle database 11g  第2章 配置网络服务名  第3章 使用sql database  第4章 使用sql*plus 第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 ...

    精通Oracle.10g.PLSQL编程

    &lt;br&gt; 前言 第1章 PL/SQL综述 1.1 SQL简介 1.2 PL/SQL简介 1.3 Oracle 10g PL/SQL新特征 第2章 PL/SQL开发工具 2.1 SQL*Plus 2.2 PL/SQL Developer 2.3 Procedure ...

    Oracle Database 11g初学者指南--详细书签版

     Michelle Malcher是一名高级数据库管理员,在数据库开发、设计和管理方面具有十多年经验.她是性能调优、安全、数据建模和超大型数据库环境数据库体系结构方面的专家.她是IOUG Best Practices Tip Booklet的特约作者...

    Oracle 10g 开发与管理

    本文是由笔者2012年学习oracle数据库时编写的学习札记,其中的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 目录 第一讲 Oacle关系数据库 ...

    Oracle11g从入门到精通

    对于初学者,《Oracle11g从入门到精通》是一本很好的入门教程,对Oracle管理员和应用程序开发员,也有很好的学习和参考价值。  Oracle数据库系统是数据库领域最优秀的数据库之一,《Oracle11g从入门到精通》以...

Global site tag (gtag.js) - Google Analytics