Oracle 触发器语法及实例(一)

2016-02-19 18:31 9 1 收藏

今天图老师小编给大家精心推荐个Oracle 触发器语法及实例(一)教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~

【 tulaoshi.com - 编程语言 】

  一 Oracle触发器语法

  触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。

  功能:

  1、 允许/限制对表的修改

  2、 自动生成派生列,比如自增字段

  3、 强制数据一致性

  4、 提供审计和日志记录

  5、 防止无效的事务处理

  6、 启用复杂的业务逻辑

  触发器触发时间有两种:after和before。

  1、触发器的语法:

  CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件

  ON表名

  [FOR EACH ROW]

  BEGIN

  pl/sql语句

  END

  其中:

  触发器名:触发器对象的名称。

  由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。

  触发时间:指明触发器何时执行,该值可取:

  before---表示在数据库动作之前触发器执行;

  after---表示在数据库动作之后出发器执行。

  触发事件:指明哪些数据库动作会触发此触发器:            

  insert:数据库插入会触发此触发器;

  update:数据库修改会触发此触发器;

  delete:数据库删除会触发此触发器。

  表 名:数据库触发器所在的表。

  for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

  2、举例:

  下面的触发器在更新表auths之前触发,目的是不允许在周末修改表:

   createtriggerauth_securebeforeinsertorupdateordelete//对整表更新前触发
  onauths
  begin
  if(to_char(sysdate,'DY')='SUN'
  RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');
  endif;
  end

  例子:

   CREATEORREPLACETRIGGERCRM.T_SUB_USERINFO_AUR_NAMEAFTERUPDATEOFSTAFF_NAME
  ONCRM.T_SUB_USERINFO
  REFERENCINGOLDASOLDNEWASNEW
  FOREACHROW
  declare
  begin
  if:NEW.STAFF_NAME!=:OLD.STAFF_NAMEthen
  begin

  客户投诉 

   updateT_COMPLAINT_MANAGEsetSERVE_NAME=:NEW.STAFF_NAMEwhereSERVE_SEED=:OLD.SEED;

  客户关怀  

   updateT_CUSTOMER_CAREsetEXECUTOR_NAME=:NEW.STAFF_NAME
  whereEXECUTOR_SEED=:OLD.SEED;

  客户服务 

   updateT_CUSTOMER_SERVICEsetEXECUTOR_NAME=:NEW.STAFF_NAME
  whereEXECUTOR_SEED=:OLD.SEED;
  end;
  endif;
  endT_sub_userinfo_aur_name;
  /

  二 Oracle触发器详解

  开始:  

   createtriggerbiufer_employees_department_id
  beforeinsertorupdateofdepartment_idonemployees
  referencingoldasold_valuenewasnew_value
  foreachrow
  when(new_value.department_id80)
  begin
  :new_value.commission_pct:=0;
  end;
  /

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  1、触发器的组成部分:

  1、 触发器名称

  2、 触发语句

  3、 触发器限制

  4、 触发操作

  1.1、触发器名称

   createtriggerbiufer_employees_department_id

  命名习惯:  

   biufer(beforeinsertupdateforeachrow)

  employees表名


  department_id列名

  1.2、触发语句

  比如:

  表或视图上的DML语句

  DDL语句

  数据库关闭或启动,startup shutdown等等 

   beforeinsertorupdate
  ofdepartment_id
  onemployees
  referencingoldasold_value
  newasnew_value
  foreachrow

  说明:

  1、 无论是否规定了department_id,对employees表进行insert的时候

  2、 对employees表的department_id列进行update的时候

  1.3、触发器限制  

   when(new_value.department_id80)

  限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。

  其中的new_value是代表更新之后的值。

  1.4、触发操作

  是触发器的主体 

   begin
  :new_value.commission_pct:=0;
  end;

  主体很简单,就是将更新后的commission_pct列置为0

  触发:  

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

   insertintoemployees(employee_id,last_name,first_name,hire_date,job_id,email,
  department_id,salary,commission_pct)
  values(12345,’Chen’,’Donny’,sysdate,12,‘donny@hotmail.com’,60,10000,.25);
  selectcommission_pctfromemployeeswhereemployee_id=12345;

  触发器不会通知用户,便改变了用户的输入值。

来源:http://www.tulaoshi.com/n/20160219/1617982.html

延伸阅读
约定和编程风格 每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。在这里举个例子: mysql DROP FUNCTION f; Query OK, 0 rows affected (0.00 sec) 如果实例比较大,则需要在某些行和段落间加注释,同时我会用将"--"符号放在页面的...
Conventions and Styles约定和编程风格 每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。在这里举个例子: mysql DROP FUNCTION f; Query OK, 0 rows affected (0.00 sec) 如果实例比较大,则需要在某些行和段落间加注释,...
Conventions and Styles约定和编程风格 每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。在这里举个例子: mysql DROP FUNCTION f; Query OK, 0 rows affected (0.00 sec) 如果实例比较大,则需要在某些行和段落间加注...
标签: SQLServer
如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。触发器可嵌套至 32 层,并且可以控制是否可以通过"嵌套触发器"服务器配置选项进行触发器嵌套。 如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且触发器将终止。 可使用嵌套触发器...
你可能了解以前的USERENV函数,它返回会话值,如用户会话ID、语言、以及用户是否拥有数据库管理员权限。虽然由于遗留原因,USERENV函数仍在使用,但在Oracle 8i中,它已被一个新的函数所替代——SYS_CONTEXT。 SYS_CONTEXT不仅能够返回USERENV数据——它还能返回应用程序定义的数据值。应用程序上下文包括一组可以被SYS_CONTEXT返回的名称...

经验教程

202

收藏

42
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部