个性化阅读
专注于IT技术分析

PL-SQL触发器

本文概要

触发器由Oracle引擎调用时自动指定事件occurs.Trigger被存入数据库并调用多次,当特定的条件匹配。

触发器是存储程序,当一些事件发生时自动执行或开除。

触发器被写入响应任何下列事件的执行。

  • 数据库操作(DML)语句(DELETE,INSERT,UPDATE或)。
  • 数据库定义(DDL)语句(创建,变更或删除)。
  • 数据库操作(SERVERERROR,登录,注销,STARTUP,或SHUTDOWN)。

触发器可以在表,视图,模式或与该事件相关联的数据库来定义。

触发器的优点

这些触发器的优点如下:

  • 触发自动生成一些派生列值
  • 强制引用完整性
  • 事件日志和对表的访问存储信息
  • 审计
  • 表的同步复制
  • 雄伟的安全授权
  • 防止无效交易

创建触发器

语法创建触发器:

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操作。
  • [COL_NAME OF]:指定将被更新的列名。
  • [ON TABLE_NAME]:此指定与触发器相关联的表的名称。
  • [REFERENCING OLD AS o新的AS N]:这可以让你参考新旧价值观的各种DML语句,如INSERT,UPDATE和DELETE。
  • [FOR EACH ROW]:这指定的行级触发器,即触发器将为每一行受到影响来执行。否则,在执行SQL语句,被称为表级触发器触发将执行一次。
  • WHEN(条件):此为行提供了条件,其触发将开火。该条款仅适用于行级触发器有效。

PL / SQL触发实施例

让我们举一个简单的例子来说明触发。在这个例子中,我们使用以下CUSTOMERS表:

创建表,并有记录:

ID名称年龄地址薪水
1Ramesh 23 Allahabad20000
2Suresh22坎普尔22000
3马赫什24Ghaziabad24000
4Chandan25Noida26000
Alex21巴黎28000
6苏尼塔20Delhi30000

创建触发器:

让我们来计划,为客户创造表,将火INSERT或UPDATE或Customers表执行DELETE操作的行级触发器。该触发器将显示旧值和新值之间的差异薪水:

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.

通过检查程序的薪水差别:

使用下面的代码来获取基本工资,新的工资和薪水差产生后触发。

DECLARE 
   total_rows number(2);
BEGIN
   UPDATE  customers
   SET salary = salary + 5000;
   IF sql%notfound THEN
      dbms_output.put_line('no customers updated');
   ELSIF sql%found THEN
      total_rows := sql%rowcount;
      dbms_output.put_line( total_rows || ' customers updated ');
   END IF; 
END;
/

输出:

Old salary: 20000
New salary: 25000
Salary difference: 5000
Old salary: 22000
New salary: 27000
Salary difference: 5000
Old salary: 24000
New salary: 29000
Salary difference: 5000
Old salary: 26000
New salary: 31000
Salary difference: 5000
Old salary: 28000
New salary: 33000
Salary difference: 5000
Old salary: 30000
New salary: 35000
Salary difference: 5000
6 customers updated

注:由于很多时候你执行该代码,旧的和新的薪资由5000增加,因此工资差异始终是5000。

以上代码的执行再次后,你将得到以下结果。

Old salary: 25000
New salary: 30000
Salary difference: 5000
Old salary: 27000
New salary: 32000
Salary difference: 5000
Old salary: 29000
New salary: 34000
Salary difference: 5000
Old salary: 31000
New salary: 36000
Salary difference: 5000
Old salary: 33000
New salary: 38000
Salary difference: 5000
Old salary: 35000
New salary: 40000
Salary difference: 5000
6 customers updated

要点

以下是两个很重要的一点,应该仔细注意。

  • OLD和NEW引用用于记录级触发器这些都不是可用的编缉表级触发器。
  • 如果你要查询的表在同一个触发器,那么你应该使用的关键字后,因为触发器可以查询表或再次更改后,才初步改变被应用,该表是早在一个一致的状态。
赞(0)
未经允许不得转载:srcmini » PL-SQL触发器

相关推荐

评论 抢沙发

评论前必须登录!