首页 > 数据库 >无涯教程-PL/SQL - 触发器(Triggers)

无涯教程-PL/SQL - 触发器(Triggers)

时间:2023-12-22 22:32:57浏览次数:41  
标签:salary UPDATE 触发器 Triggers CUSTOMERS 无涯 INSERT SQL DELETE

在本章中,无涯教程将讨论PL/SQL中的触发器,触发器是存储的程序,在发生某些事件时会自动执行或触发。

创建触发器

创建触发器的语法是-

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; 

首先,无涯教程将使用在先前各章中创建并使用的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 | 
+----+----------+-----+-----------+----------+ 

以下程序为客户表创建一个行级触发器,该触发器将针对在CUSTOMERS表上执行的INSERT或UPDATE或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.

这里需要考虑以下几点-

  • OLD和NEW引用不适用于表级触发器,而是可以将它们用于记录级触发器。

  • 如果要在同一触发器中查询表,则应使用AFTER关键字,因为触发器只有在应用了初始更改并且该表返回后,才能查询该表或再次对其进行更改。

  • 以上触发器的编写方式使其可以在对表执行任何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 

参考链接

https://www.learnfk.com/plsql/plsql-triggers.html

标签:salary,UPDATE,触发器,Triggers,CUSTOMERS,无涯,INSERT,SQL,DELETE
From: https://blog.51cto.com/u_14033984/8939174

相关文章

  • 无涯教程-PL/SQL - 记录(Records)
    在本章中,无涯教程将讨论PL/SQL中的记录(Records)。记录是一种数据结构,可以容纳不同种类的数据项。记录由不同的字段组成,类似于数据库表的一行。PL/SQL可以处理以下类型的记录-基于表的记录  (Table-basedrecords)基于游标的记录(Cursor-basedrecords)用户定义的记录(U......
  • mysql报错:Duplicate entry ‘...‘ for key ‘field‘
    错误信息"Duplicateentry'...'forkey'field'"表示在数据库表中,你正在尝试插入一条数据的'number'字段的值已经存在。这通常是由于你设置了'field'字段为唯一键(UNIQUEKEY),而你又尝试插入一个已存在的值。解决这个问题的方法有以下几种:检查输入的数据:确保你插入的数据在该字段......
  • mysql 报错 Duplicate entry ‘xxx‘ for key ‘字段名‘
    有时候对表进行操作,例如加唯一键,或者插入数据(已经有唯一键),会报错Duplicateentry...forkey...原因是primarykey(主键)或uniquekey(唯一键)的值重复。还有索引也会导致。碰到这种情况,考虑是否需要主键或唯一键的约束,如果不需要,就直接删除约束。在navicat上有√可以选。命令行如下删除......
  • 无涯教程-PL/SQL - 游标(Cursors)
    在本章中,无涯教程将讨论PL/SQL中的游标,Oracle创建一个内存区域,称为上下文区域,用于处理SQL语句,其中包含处理该语句所需的所有信息。您可以命名游标,以便可以在程序中引用该游标以一次获取和处理SQL语句返回的行,游标有两种类型-Implicit隐式游标Explicit显式游标隐式游标当执......
  • NoSQL学习第六天心得
    经过第六天的NoSQL学习,我获得了更多的收获和感悟。以下是我的心得总结:一、深入理解NoSQL数据库的原理和架构在第六天的学习中,我深入了解了NoSQL数据库的原理和架构。通过学习,我更加清晰地认识到NoSQL数据库的分布式、可扩展、高可用性等特点,以及其与关系型数据库的区别和优势。同时......
  • 无涯教程-PL/SQL - 函数(Functions)
    在本章中,无涯教程将讨论PL/SQL中的函数,函数与过程相同,只不过它返回一个值,因此,上一章的所有讨论也适用于函数。创建函数使用CREATEFUNCTION语句创建一个函数。CREATEORREPLACEPROCEDURE语句的简化语法如下-CREATE[ORREPLACE]FUNCTIONfunction_name[(parameter_n......
  • MYSQL LIKE 优化
    1、多字段like模糊查询优化:最常见的写法:wherealike'%xx%'orblike'%xx%'orclike'%xx%'这种写法查询效率低,经过调查,下面的方法可以替代,并且效率高:2、如果like的关键字相同:whereinstr(nvl(a,'')||nvl(b,'')||nvl(c,''),'xx')>0把要模糊......
  • 无涯教程-PL/SQL - 存储过程(Procedures)
    在模式级别,存储过程是独立子程序,它是使用CREATEPROCEDURE或CREATEFUNCTION语句创建的,它存储在数据库中,可以使用DROPPROCEDURE或DROPFUNCTION语句删除。PL/SQL子程序被称为PL/SQL块,可以使用一组参数来调用它们。PL/SQL提供两种子程序-Functions  -这些函数返回单个值,主......
  • mysql-binlog恢复命令
    查看是否开启binloq:showvariableslike'logbing';开启binlog:log-bin="LAPTOP-7FRIEVH7-bin关闭binlog:skip-log-bin生成新的binlog文件:方式一:重启mysq1服务使用命令flushlogs方式二:查看binlogshowbinlogeventsin'ECS-56099351-bin.00001';将binlog日志并......
  • 将excel数据导入到SQL server数据库的详细过程
    原文链接:https://www.xjx100.cn/news/415146.html?action=onClick1.将要导入的excel表格数据如下,第一行数据默认为数据库表中的字段,所以这个必须要有,否则无法映射导入。如下图(只截部分数据) 2.打开MicrosoftSQLServerManagementStudio17数据库管理软件,选中要导入的mydb数......