Oracle PL/SQL中的触发器
sql语句的执行一般都是一条一条的,当我们想执行了某一条sql语句时,会自动执行某些事件,这个时候就可以用到触发器。触发器顾名思义就是一件事的发生会被触发产生某一个事件。
创建了某触发器时,当执行的sql语句符合条件就会自动执行触发器里面的内容。
1.创建触发器
跟创建表很类似。 其中trigger单词有触发的意思
create or replace trigger 触发器名 before/after 触发的原因 on 表名for each rowbegin触发器所需要执行的内容 end;
其中:
before/after : 顾名思义选择了before就是执行了触发该操作之前执行触发器里的内容,after就是之后。
触发的原因: 就是该表执行了某些sql动作,如delete ,insert , update 。允许多个动作的存在,也正因为每条sql语句只有删除,插入,更新,所以多个动作的出现的关系也只有or 。如 delete or insert 。 也正是对于表的数据的处理能够影响到数据 也只有 增 删 改
触发器所需要执行的内容: 当执行的sql语句符合触发器触发的动作,就会自动执行begin与end之间的内容。
举个例子,创建一个Person表,里面有姓名和年龄,在创建一个person_record记录表,里面有status状态值和sdate操作时间。当status表示Person表数据插入删除更新的情况,status = 1时,认定为Person插入了新的数据。下面实现该触发器。
创建Person表,person_record表
create table Person(pname varchar2(10) not null,page number(3) not null,pid number(5) unique
);create table person_record(status int ,sdate date);
创建person_after_insert触发器
create or replace trigger person_after_insert
after insert on Person
for each row
begin insert into person_record(status,sdate) values(1,sysdate);
end;
我们来进行测试一下。
首先查看person_record表,目前是空表。
select * from person_record;
当我们执行对Person表进行数据插入时:
insert into Person(cname,cage) values('大白',20);
我们再次查询person_record表就会新插入一条数据。
另外对其表的更新删除数据的触发器大同小异,只需要更改insert为update或delete即可。
此外,当触发器响应的行为是update时,就是更新表的数据,可以更改一行数据,也可以更改多行数据。当修改表中n行的数据时,触发器begin与end间的内容就会被执行n次。
比如,依旧保存上述的Person和person_record表,认为person_record表中的status=0为Person表被修改。 我们创建一个person_after_update触发器,用来自动触发修改表的数据要执行的内容。对Person表进行年龄或者姓名修改,创建一个person_update表,记录Person表修改数据前后的姓名和年龄。
当需要得到表修改数据的行的修改前和修改后的数据就需要用到:old 虚拟表和:new 表 来访问。:old 的值为只读,:new的值可修改update修改的字段 访问数据的格式为:old.字段名 ,:new.字段名
创建person_update表
create table person_update(poldname varchar2(100) ,pnewname varchar2(100),poldage number(2),pnewage number(2)
);
创建person_after_update触发器
create or replace trigger person_after_update
after update on Person
for each row
begin insert into person_update values(:new.cname,:old.cname,:old.cage,:new.cage);insert into person_record(status,sdate) values(0,sysdate);end;
执行上述语句之后,我们来进行一下测试。
查看Person 表,person_update表,
写入对Person表的更新操作
对一行数据的更新
update Person set cage = 66 where cname = '新手';
对多行数据的更新
update Person set cage = 88 where cname = '大白';
执行完了之后,查看person_update,person_record两表
上述图,对其两个更新操作有重复执行了一次。
2.删除触发器
删除触发器与删掉表很像。drop trigger 触发器名
例如,我们将其上述创建的person_after_insert触发器删掉
drop trigger person_after_insert;
Oracle PL/SQL中的触发器相关推荐
- Oracle:PL/SQL 中如何使用Array
http://tech.163.com/05/0701/10/1NIODMQS00091589.html 因为在PL/SQL 中并没有数组. 这是偶查资料找的范例和自己写的范例来解释如何在PL/SQL ...
- oracle 全局临时变量,如何解析Oracle PL / SQL中的简单XML片段并将其加载到全局临时表中?...
Oracle的XML数据库实现有一些令人困惑的令人眼花缭乱的选项,并且在任何给定的场景中并不总是清楚(至少对我而言).在这种特殊情况下,你想要的是 XMLTable(),它将XQuery变成一组行. ...
- Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...
- Oracle PL/SQL中异常高级特性
在OraclePL/SQL语句块中exception的异常处理部分是非常重要的组成部分,它决定了在PL/SQL语句块内部可执行部分在发生异常错误时,程序是友好地提示:程序遇到某些错误而无法执行,还是抛 ...
- Oracle PL/SQL中的循环处理(sql for循环)
今年春节算是休了个长假,调整好心态,迎接新一年的挑战. 今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在 ...
- oracle获取堆栈,如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?
我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. >在proc_a中抛出异常 >抓住例外. >执行回滚. >提出异常. >捕获异常(父块) >打印堆栈跟 ...
- oracle pl/sql 中目录的创建
模式: create or replace directory 目录名 as '目录地址'; 举例: create or replace directory MEDIA_DIR as 'd:\or ...
- Oracle PL/SQL中EXCEPTION用法
1.自定義EXCEPTION DECLARE past_due EXCEPTION; acct_num NUMBER := 2; BEGIN DECLARE ---------- sub-block ...
- oracle 自定义类型使用方法,oracle pl/sql中使用自定义数据类型
模式: CREATE OR REPLACE TYPE 类型名 as OBJECT (属性名 属性类型,...); 举例: CREATE OR REPLACE TYPE BITS_IDX_BASE AS ...
最新文章
- 跨平台PHP调试器设计及使用方法——拾遗
- AVFoundation学习Demo--拍摄视频
- opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)
- C#并行编程(6):线程同步面面观
- Linux 实现网页劫持,Linux下实现劫持系统调用的总结(上)--代码及实现
- apollo 配置中心_.NET Core 下使用 Apollo 配置中心
- rsync一行代码实现远程文件同步之修改默认22端口
- 怎样快速读完一本网络小说
- tflite C++ API 部署分类模型
- android listview 滑动条显示_ListView详细介绍与使用
- 手把手搭建WAMP+PHP+SVN开发环境
- 移动端安全|Drozer针对Sieve渗透示范
- Apache详细的安装和配置
- 虚拟服务器443端口开启,服务器开启443端口
- qume 模拟NVMe zns 设备(Creating an Emulated Zoned Namespace)
- 微信手气红包算法 php,微信随机生成红包金额算法php版
- 《构建之法》读书笔记——第1章 概论
- flask搜索引擎whoosh的配置
- Android桌面布局
- cranberry病毒导致mycat应用都崩溃解决办法