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中的触发器相关推荐

  1. Oracle:PL/SQL 中如何使用Array

    http://tech.163.com/05/0701/10/1NIODMQS00091589.html 因为在PL/SQL 中并没有数组. 这是偶查资料找的范例和自己写的范例来解释如何在PL/SQL ...

  2. oracle 全局临时变量,如何解析Oracle PL / SQL中的简单XML片段并将其加载到全局临时表中?...

    Oracle的XML数据库实现有一些令人困惑的令人眼花缭乱的选项,并且在任何给定的场景中并不总是清楚(至少对我而言).在这种特殊情况下,你想要的是 XMLTable(),它将XQuery变成一组行. ...

  3. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE

    1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...

  4. Oracle PL/SQL中异常高级特性

    在OraclePL/SQL语句块中exception的异常处理部分是非常重要的组成部分,它决定了在PL/SQL语句块内部可执行部分在发生异常错误时,程序是友好地提示:程序遇到某些错误而无法执行,还是抛 ...

  5. Oracle PL/SQL中的循环处理(sql for循环)

    今年春节算是休了个长假,调整好心态,迎接新一年的挑战. 今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在 ...

  6. oracle获取堆栈,如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?

    我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. >在proc_a中抛出异常 >抓住例外. >执行回滚. >提出异常. >捕获异常(父块) >打印堆栈跟 ...

  7. oracle pl/sql 中目录的创建

    模式: create or replace directory 目录名 as '目录地址'; 举例: create or replace directory MEDIA_DIR   as 'd:\or ...

  8. Oracle PL/SQL中EXCEPTION用法

    1.自定義EXCEPTION DECLARE past_due EXCEPTION; acct_num NUMBER := 2; BEGIN DECLARE  ---------- sub-block ...

  9. oracle 自定义类型使用方法,oracle pl/sql中使用自定义数据类型

    模式: CREATE OR REPLACE TYPE 类型名 as OBJECT (属性名 属性类型,...); 举例: CREATE OR REPLACE TYPE BITS_IDX_BASE AS ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——拾遗
  2. AVFoundation学习Demo--拍摄视频
  3. opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)
  4. C#并行编程(6):线程同步面面观
  5. Linux 实现网页劫持,Linux下实现劫持系统调用的总结(上)--代码及实现
  6. apollo 配置中心_.NET Core 下使用 Apollo 配置中心
  7. rsync一行代码实现远程文件同步之修改默认22端口
  8. 怎样快速读完一本网络小说
  9. tflite C++ API 部署分类模型
  10. android listview 滑动条显示_ListView详细介绍与使用
  11. 手把手搭建WAMP+PHP+SVN开发环境
  12. 移动端安全|Drozer针对Sieve渗透示范
  13. Apache详细的安装和配置
  14. 虚拟服务器443端口开启,服务器开启443端口
  15. qume 模拟NVMe zns 设备(Creating an Emulated Zoned Namespace)
  16. 微信手气红包算法 php,微信随机生成红包金额算法php版
  17. 《构建之法》读书笔记——第1章 概论
  18. flask搜索引擎whoosh的配置
  19. Android桌面布局
  20. cranberry病毒导致mycat应用都崩溃解决办法

热门文章

  1. 音视频通话:腾讯云 webRTC音视频通话的使用
  2. B站有屏幕的地方就有烂苹果badapple是怎么做出来的?
  3. Linxu #2 服务器大量 ESTABLISHED 状态请求处理记录
  4. Ubuntu分区方案
  5. element的复杂表单验证
  6. Design Principle
  7. FFMPEG Tips
  8. Gradle配置解决下载速度慢问题
  9. css动画制作幻灯片
  10. 微星主板节能模式怎么关闭_649元华硕H410主板天坑?英特尔酷睿I5处理器降频的秘密...