codecamp

PL / SQL触发器

触发器是存储程序,当一些事件发生时自动执行或解雇。触发器,事实上,写入响应于以下任一事件要执行的:

  • 数据库操作(DML)语句(DELETE,INSERT,UPDATE或)。

  • 数据库定义(DDL)语句(创建,变更或删除)。

  • 数据库操作(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] |删除}:指定DML操作。

  • [OF COL_NAME]:指定将被更新的列名。

  • [开TABLE_NAME]:此指定与触发器关联的表的名称。

  • [REFERENCING OLD AS o新的为n]:这可以让你参考新旧价值观各种DML语句,如INSERT,UPDATE和DELETE。

  • [FOR EACH ROW]:指定一个行级触发器,即触发器将每一行受到影响执行。否则,在执行SQL语句,它被称为表级触发器触发将执行一次。

  • WHEN(条件):此为行提供了条件该触发器将触发。该条款仅适用于行级触发器有效。

例:

首先,我们将使用我们已经创建,并在前面的章节中使用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 |
+----+----------+-----+-----------+----------+

下面的程序创建了客户表,将火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引用是不可用于表级触发器,而你可以将它们用于记录级别的触发器。

  • 如果您想查询表中相同的触发,那么你应该使用关键字后,由于触发器可以查询表或再次更改后,才初步改变被应用,该表是早在一个一致的状态。

  • 上述触发已经写在这样一种方式,它会之前的任何DELETE火灾或表的INSERT或UPDATE操作,但你可以写在一个或多个操作触发器,例如BEFORE DELETE,这将触发每当一个记录将使用表的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:

因为这是一个新的记录这么老的工资不提供上述结果即将为空。现在,让我们对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

PL / SQL - 操作员
PL / SQL条件
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }