pl/sql 包与触发器

来源:互联网 发布:淘宝卖烟丝的怎么搜索 编辑:程序博客网 时间:2024/05/16 06:50


pl/sql中包由两部分组成,

--规范(specification)

--包体(body)


包规范中含有包的相关信息,列出了可用的过程和函数名,具体实现在包体中,即如.h文件。所有人都对其中的信息有访问能力,

这些被称为公有对象。

包体重包含的过程和函数只能被自身访问,是私有的。即如.c或.cpp文件。


基本语法结构:

创建specification:

CREATE [OR REPLACE] PACKAGE package_name

{ IS | AS }

package_specification

END package_name;

创建body:

CREATE [OR REPLACE] PACKAGE BODY package_name

{ IS | AS }

package_body

END package_name;


注意:1.调用其中信息时需要在前面加上包名,以.分隔。

        2.除非包规范成功编译,否则主题无法编译。

        3.过程或函数可以重载,但是要求不仅仅在参数名称、参数模式上和返回类型上不同。

        4.参数类型不能使用同一类型系列,如char与varchar。

        5.数字类型不同时可以进行重载。如number、binary_number


触发器:是一种特殊过程。发生特定时间时执行。

触发器trigger与函数、过程的不同点:

1.没有参数列表 

2.无is

3.被动调用

4.不能作为包的成员

5.禁止使用commit、rollback语句。

基本语法:

CREATE [OR REPLACE] TRIGGER trigger_name { BEFORE | AFTER } trigger_event

ON table_name

[ REFERENCING [ OLD AS old_name ] [ NEW AS new_name ] ]

[ FOLLOWS another_trigger ]

[ { ENABLE | DISABLE } ]

[ WHEN ( trigger_condition ) ]

[ FOR EACH ROW ]

[ DECLARE ]

BEGIN

   trigger_body

END trigger_name;


简单分为before和after触发器

before触发器:发生在对数据的更改被持久化之前被触发。可以偷换对数据的更改。

after触发器:发生在对数据的更改被持久化之后触发。


又可以分为行级触发器与语句级触发器

语句级触发器:触发次数等于执行DML语句的次数。

行级触发器:触发次数等于被影响的行的次数。


3种关联标识符:     :OLD、:NEW、:PARENT

:PARENT 用于对嵌套表定义的情况下引用嵌套表父表的当前记录行。

:OLD 关联正在处理的数据行在DML语句级其激活的触发器发挥作用之前的内容。

:NEW 关联在DML语句级其激活的触发器发挥作用之后将要变成的内容。

注意:

1.:new、:old只能用于行级触发器

2.不能再after触发器中更改:new的值

3.不能更改:old的值

4. 只有行级触发器中使用when子句,并且when子句中:new、:old记录不需要:

5.仅在主体中要:


触发器执行顺序:

before语句级触发器 -> before行级触发器 -> DML语句 -> after行级触发器 -> after语句级触发器


follows关键字用来处理同一级触发器的顺序问题,后加已定义的触发器。


ENABLE/DISABLE:声明触发器的状态,启用或禁止。


instead of 触发器

基本语法

CREATE [OR REPLACE] TRIGGER trigger_name INSTEAD OF trigger_event

ON view_name

[ REFERENCING [ OLD AS old_name ] [ NEW AS new_name ] ]

[ FOLLOWS another_trigger ]

[ { ENABLE | DISABLE } ]

[ WHEN ( trigger_condition ) ]

[ FOR EACH ROW ]

[ DECLARE ]

BEGIN

   trigger_body

END trigger_name;

注意:

1.instead of 触发器仅能定义在视图上

2.必须是行级触发器,有没有for each row都是行级触发器

3.不能创建系统触发器

4.DML语句仅触发instead of触发器,不执行。

一般的视图是可以用来更新的,但是含有avg,sum等函数的视图无法用update更新,所以需要instead of触发器来进行。


0 0
原创粉丝点击