触发器是存放在数据库中的一种特殊类型的子程序。不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动

调用执行。触发器不能接受參数。所以执行触发器就叫做触发或点火。Oracle事件指的是数据库的表进行的insert 、update、delete操作或对视图进行类似的操作。

触发器是很多关系数据库系统都提供的一项技术。在Oracle系统里,触发器类似过程和函数,都有声明,运行和异常

处理过程的PL/SQL块。

触发器的组成:

触发事件:在何种情况下触发;比如:INSERT , UPDATE , DELETE 。

触发时间:是在触发事件发生之前还是之后触发,也就是触发事件和trigger的操作顺序。

触发器本身:trigger被触发之后的目的和意图,正是触发器本身要做的事。

触发器频率:触发器内定义的动作被运行的次数。有语句级触发器和行级触发器。语句级触发器当触发事件发生时,仅仅运行一次。行级触发器当触发事件发生时,每一行运行一次。

基本的语法:

create or replace trigger trigger_name

before | after

insert | delete | update on table_name

for each row

when condition

before和after指出触发的时序是前触发还是后触发。前触发是在触发事件之前运行,后触发是在触发事件之后运行。for each row 说明触发器为行触发器。when子句说明的是触发的约束条件。

例:编写一个简单触发器,当运行update操作时,输出helloworld 。

create or replace trigger update_emp_trigger

after 

       update on emp 

       for each row 

begin 

    dbms_output.put_line('Hello World');

end ;

測试:

SQL> update emp set sal = sal+ 10 ;

 

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

 

14 rows updated

上面的測试中,并没有调用触发器,触发器是系统自己主动运行的。并不能为用户直接调用。for each row假设不写则默觉得语句级触发器。

:new 和 :old 修饰符

:new 修饰符訪问操作完毕后列的值。

:old 修饰符訪问操作完毕前列的值。

例:使用:new和:old操作符分别获取更新之前的值,和之后的值。

create or replace trigger update_emp_trigger1

after 

       update on emp 

       for each row 

begin 

    dbms_output.put_line(:old.sal || ',' || :new.sal);

end ;

測试:

SQL> update emp set sal = sal+ 10 ;

 

902,912

1717.44,1727.44

1346.13,1356.13

3115.19,3125.19

1346.13,1356.13

2985.14,2995.14

2568.98,2578.98

3141.2,3151.2

5120.5,5130.5

1611.35,1621.35

1186.99,1196.99

2100.8,2110.8

3141.2,3151.2

1399.17,1409.17

 

14 rows updated

删除触发器

基本的语法

DROP TRIGGER trigger_name ;

创建触发器时,假设错误发生能够使用show errors命令来查看错误信息。



将数据和子程序组合在一起构成包。与java中的类类似,包在PL/SQL程序设计中,用以实现面向对象的技术。

包的构成分为两个部分,一个是说明部分,一个是实现部分。

定义包

create or replace package body package_name

is | as

begin

--pl/sql 语句;

end ;

对包内共同拥有元素的调用格式为:包名.类名 。

删除包

DROP PACKAGE package_name ;

Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)的更多相关文章

  1. Oracle 学习笔记(Windows 环境下安装 + PL/SQL)

    Oracle 安装.PL/SQL 配置使用  前言:因更换机械硬盘为 SSD 固态硬盘装了新 Windows 7 系统,需要重新搭建开发环境,把 Oracle 安装过程和 PL/SQL 配置使用做下笔 ...

  2. Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

    PL/SQL子程序 它包含了函数和过程.此功能是指用户定义的函数.和系统功能是不同的.子程序通常完成特定的功能PL/SQL座.,能够被不同的应用程序多次调用.Oracle提供能够把PL/SQL程序存储 ...

  3. oracle 学习笔记之触发器

    说明 数据库触发器是一个与表相关联的.存储的PL/SQL程序. 每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自己主动地运行触发器中定义的语句序 ...

  4. Oracle学习笔记十三 触发器

    简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用.   触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供审计和 ...

  5. Oracle学习笔记之触发器

    触发器 触发器(trigger)是一些过程,与表关系密切,用于保护表中的数据,当一个基表被修改(INSERT.UPDATE或DELETE)时,触发器自动执行,例如通过触发器可实现多个表间数据的一致性和 ...

  6. Oracle学习笔记十四 内置程序包

    扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...

  7. Oracle学习笔记—数据字典和常用命令(转载)

    转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...

  8. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  9. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

随机推荐

  1. Linux多任务编程——线程

    线程基础 △ 由于进程的地址空间是私有的,因此在进行上下文切换时,系统开销比较大 △ 在同一个进程中创建的线程共享该进程的地址空间 △ 通常线程值得是共享相同地址空间的多个任务 △ 每个线程的私有这些 ...

  2. jquery之null的数组

    去掉null的数组 function ClearNullArr(arr) {    for (var i = 0;  i < arr.length; i++) {         if(arr[ ...

  3. C#中new和override的区别

    override是指“覆盖”,是指子类覆盖了父类的方法.子类的对象无法再访问父类中的该方法.(签名必须相同) new是指“隐藏”,是指子类隐藏了父类的方法,当然,通过一定的转换,可以在子类的对象中访问 ...

  4. 为自己的Android应用添加广告

    平时也写了不少Android小应用,但是都是做练习之用,从来没有想过添加广告赚钱这一说. 个人是非常反感在应用内添加广告这种行为的,非常影响用户体验,不小心点到广告的话,手机流量哗哗地就没了··· 但 ...

  5. QTP描述性编程中往WebEdit控件输入文字问题

    在网上查找到许多相关的描述性编程的案例,自己就想动手一试,于是在专家视图中输入如下代码: systemUtil.Run "http://www.baidu.com" wait(15 ...

  6. IOS 请求服务器的方式

    IOS 中请求服务器的方式主要有Get 和Post . Get :[1]向服务器发索取数据的一种请求; [2]获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改;请求的参数会跟在url后 ...

  7. C++ BitArray 引用计数实现

    #ifndef __BITARRAY__ //数组不支持多线程同时访问,没有对引用计数以及分配的资源做任何锁处理 #define __BITARRAY__ 1 //越界访问修改为抛出异常 #ifdef ...

  8. Trident内核中取验证码图片的几种方法

    程序中用了IE的内核,想取出网站中的验证码图片,单独显示出来,调研了以下几路方法 1.枚举所有缓存文件,进行处理,找到想要的,核心代码 )//这段代码可以枚举所有缓存资源,然后对应做处理 { LPIN ...

  9. 【android】android调用模拟器超时问题

    问题如下: 解决方案: 1)重启连接桥 C:\Users\hacket>adb kill-server C:\Users\hacket>adb start-server或者 adb log ...

  10. php base64数据与图片的转换

    1.解析base64数据成图片 The problem is that data:image/bmp;base64, is included in the encoded contents. This ...