SQL记录-PLSQL触发器
PL/SQL触发器
触发器是存储程序,它会自动执行或发射当一些事件发生。触发器,事实上,写入响应于以下任一事件将被执行:
数据库操作(DML)语句(DELETE,INSERT,UPDATE或)
数据库定义(DDL)语句(CREATE,ALTER或DROP)
数据库操作(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] | DELETE}: 指定DML操作
[OF col_name]: 指定将被更新的列名
[ON table_name]: 指定触发器相关联的表的名称
[REFERENCING OLD AS o NEW AS n]: 可以参考新旧值的各种DML语句,如INSERT,UPDATE和DELETE
[FOR EACH ROW]: 指定的行级触发器,即触发器将每一行受到影响执行。否则,当执行SQL语句,这被称为表级触发器触发将执行一次
WHEN (condition): 触发器将触发的条件。此子句仅适用于行级触发器有效
示例:
首先,将使用我们已经创建,并在前面的章节中使用的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在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引用是不可用于表级触发器,而不可以使用它们的创纪录级别的触发器。
如果想查询表中相同的触发,那么应用应该使用AFTER关键字,因为触发器可以查询该表,或再次改变它最初的变化仅适用后的表是回到一致的状态。
上述触发已经写在这样一种方式,它会在任何DELETE、INSERT或UPDATE操作在表上之前执行,但可以夺触发器上编写一个或多个操作,例如BEFORE 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:
因为这是一个新的记录,因此基本工资不可用及以上的结果来为空(null)。现在,让我们对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
SQL记录-PLSQL触发器的更多相关文章
- SQL记录-PLSQL记录
PL/SQL记录 PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行. 例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题 ...
- SQL记录-PLSQL基本语法与数据类型
PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...
- SQL记录-PLSQL游标
PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...
- SQL记录-PLSQL条件控制
PL/SQL条件控制 决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. 以下是从在大 ...
- SQL记录-PLSQL变量与常量文字
PL/SQL变量 变量是只不过是一个给定的存储区域,程序可以操纵的名称.PL/SQL每个变量具有一个特定的数据类型,它决定了大小和变量的存储器的值,可以说存储器和设置操作可以施加到可变内被存储的范 ...
- SQL记录-PLSQL包
PL/SQL包 PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象. 程序包将有两个强制性的部分: 包装规范定义 包体或定义 包装规范定义 规范是接口到包.它只是声明的类型,变量,常量 ...
- SQL记录-PLSQL函数
PL/SQL函数 PL/SQL函数与过程相同,不同之处在于函数有一个返回值.因此,前面的章节中的所有讨论都适用于函数. 创建函数 建立一个独立函数可以使用CREATE FUNCTION语句创建.CRE ...
- SQL记录-PLSQL过程
PL/SQL过程 子程序是一个程序单元/模块执行特定的任务.这些子程序被组合以形成更大的程序.这基本上是被称为“模块化设计”.子程序可以调用由另一个子程序或程序被称为调用程序. 子程序可以创建: ...
- SQL记录-PLSQL数组
PL/SQL数组 PL/SQL程序设计语言提供叫一种叫做VARRAY的数据结构,其可存储相同类型元素的一个固定大小的连续集合.VARRAY用于存储数据的有序集合,但它往往是更加有用认为数组作为相同类型 ...
随机推荐
- Spring Boot(十一):Spring Boot 中 MongoDB 的使用
MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配 ...
- SSIS 剖析数据流之:连接和查找转换
在SSIS的数据流组件中,SSIS引擎使用Merge Join组件和 Lookup组件实现TSQL语句中的inner join 和 outer join 功能,Lookup查找组件的功能更类似TSQL ...
- Mac 上flink的安装与启动
在Mac 上安装flink,需要通过Homebrew安装的 1.howmebrew的安装方式,在终端粘贴以下命令,或者去官网https://brew.sh/index_zh-cn 找到此代码复制粘贴到 ...
- 用Micro:bit做交通信号灯
交通信号灯项目在控制技术中,有点像"Hello world!" 是一个入门级的范例. 对于孩子来说,交通灯跟日常生活息息相关,他们都熟悉,充分知道需要做什么这是一个让孩子开始的好项 ...
- 1. Python3 环境搭建
Python3 环境搭建 开门见山,其他关于Python发展史.语言类型.优缺点等等 可以自己去百度百度,这里就不多说了.其实基本想要学这门语言的时候,你已经了解差不多了!!! Python的运行环境 ...
- MSSQL批量写入数据方案
近来有一个项目Feature需要有批量写入数据的场景,正巧整理资料发现自己以前也类似实现的项目,在重构的同时把相关资料做了一个简单的梳理,方便大家参考. 循环写入(简单粗暴,毕业设计就这样干的)(不推 ...
- Alpha版本测试
Alpha版本测试报告 项目名称:面向团队的日程提醒系统 软件版本:1.0.0 开发方:Team c# 开发代表:崔强 杜正远 是否经过开发自测(单元测试):是 软件运行环境: Android4.4. ...
- C++:同名隐藏和赋值兼容规则
一.同名隐藏 同名隐藏,即在C++的继承中,只要子类的函数名和父类的函数名相同,子类中的函数将会隐藏所有父类中和子类的成员函数同名的函数 特别注意: 和函数之间的重载不同,这里只要求函数的名字相同,而 ...
- SQL Sever——远程过程调用失败(0x800706be)
最近重装了系统,VS和SQL Sever莫名奇妙的不能用了.下面总结一下这个过程中遇到的问题,跟大家分享一下经验~~ 大概是以前的安装过程都十分顺利,这次,在尝试了数次登陆不上去之后,我仍然怀疑是自己 ...
- 第四篇——Spring音乐登录界面设计及实现(C#)
Spring音乐播放器,我们小组设计其启动时有一个登录界面,用户初次可以注册,输入用户名和密码,点击注册即将输入信息保存到register文本文件中:如果已有用户名,输入用户名和密码,点击登录,程序会 ...