包是一种将过程、函数和数据结构捆绑在一起的容器;包由两个部分组成:外部可视包规范,包括函数头,过程头,和外部可视数据结构;另一部分是包主体(package body),包主体包含了所有被捆绑的过程和函数的声明、执行、异常处理部分。
打包的PL/SQL程序和没有打包的有很大的差异,包数据在用户的整个会话期间都一直存在,当用户获得包的执行授权时,就等于获得包规范中的所有程序和数据结构的权限。但不能只对包中的某一个函数或过程进行授权。包可以重载过程和函数,在包内可以用同一个名字声明多个程序,在运行时根据参数的数目和数据类型调用正确的程序。
创建包必须首先创建包规范,创建包规范的语法如下:
|
创建包主体使用CREATE PACKAGE BODY语句:
|
私有数据结构是那些在包主体内部,对被调用程序而言是不可见的。
触发器(Triggers)
触发器是一种自动执行响应数据库变化的程序。可以设置为在触发器事件之前或之后触发或执行。能够触发触发器事件的事件包括下面几种:
DML事件
DDL事件
数据库事件
DML事件触发器可以是语句或行级触发器。DML语句触发器在触发语句之前或之后触发DML行级触发器在语句影响的行变化之前或之后触发。用户可以给单一事件和类型定义多个触发器,但没有任何方法可以增强多触发器触发的命令。下表列出了用户可以利用的触发器事件:
事件 | 触发器描述 |
INSERT | 当向表或视图插入一行时触发触发器 |
UPDATE | 更新表或视图中的某一行时触发触发器 |
DELETE | 从表或视图中删除某一行时触发触发器 |
CREATE | 当使用CREATE语句为数据库或项目增加一个对象时触发触发器 |
ALTER | 当使用ALTER语句为更改一个数据库或项目的对象时触发触发器 |
DROP | 当使用DROP语句删除一个数据库或项目的对象时触发触发器 |
START | 打开数据库时触发触发器,在事件后触发 |
SHUTDOWN | 关闭数据库时触发,事件前触发 |
LOGON | 当一个会话建立时触发,事件前触发 |
LOGOFF | 当关闭会话时触发,事件前触发 |
SERVER | 服务器错误发生时触发触发器,事件后触发 |
创建触发器的语法如下:
|
只有DML触发器(INSERT、UPDATE、DELETE)语句可以使用INSTEAD OF触发器并且只有表的DML触发器可以是BEFORE或AFTER触发器。
象约束一样触发器可以被设置为禁用或启用来关闭或打开他们的执行体(EXECUTE),将触发器设置为禁用或启用使用ALTER TRIGGER语句:
|
要禁用或启用表的所有触发器,使用ALTER TABLE语句
|
删除触发器使用DROP TRIGGER
|