的过程,必须首先列出名称,接着是过程名称,如下:
execute Test_sales_information_pkg.init_item_price(p_warehouse_id?1 ); 包允许多个过程使用相同的变量和数据指针。包中的过程和函数,可为公共访问或为专用。
在创建包时,包的定义和包内容被分别地生成。从而,有两个命令create package和包内容的create package body命令。必须具备create procedure系统权限。 1.
建立包定义的语法:
create [or replace] package [user.]package {is |as} PL/SQL package specification; 包的内容由所有列在包定义中的公用对象的PL/SQL代码块及其定义组成。包的内容也可包括未列在包定义中的对象。 2.
包的初始化:
一个包中可以包括代码,在每次用户执行此包时最先被运行。 Create or replace package body test_sales_information_pkg As User_name varchar2(20); Entry_date date; … … begin select user, sysdate into user_name, entry_date from dual; end test_sales_information_pkg; 3.
包的编译和代码察看:
当对象在创建时,Oracle就编译它们,然而,当它们所引用的的数据库对象发生变化时,就有可能变为变为非法的操作。在这些对象下次执行时,它们被数据库重新编译。也可显示的重新编译这类对象,以提高数据库处理的性能,语法如下: alter package [user.]package_name compile [package| body];
可以通过查询下面的数据字典视图获得当前过程、函数、包和包的内容的源代码: USER_SOURCE ALL_SOURCE DBA_SOURCE
对于用户所有的过程对象
对于用户所有的或者被授权访问的规程对象
对于数据库中所有的过程对象
检索的列为TEXT并按照LINE(行号)顺序。
28
Company Confidential - For internal use only
触发器
触发器定义了当一些数据库相关事件发生时数据库应采取的动作。触发器可用于增加描述性的应用完整性,加强复杂业务的规则,或者监控数据的变动。
所需权限:
1.
所需系统特权:
为了在标上建立一个触发器,必须能够对标进行改动的,所以用户必须在表上具有ALTER权限,或者具有ALTER ANY TABLE系统权限。此外用户还需有CREATE TRIGGER系统特权,要在SCHEMA上创建触发器,必须具有CREATE ANY TRIGGER系统特权。
同时,要更改一个触发器,必须拥有触发器或者具有ALTER ANY TRIGGER系统特权。 2.
所需表权限:
除了激活触发器事件的表外,触发器还可以应用其他的表,故还必须拥有处理其他表的权限
触发器类型:
1. 行级别(Row_Level)触发器
对于处理中的每一行,行级触发器都执行一次。这是最常用的触发器类型,常用于数据监控和审计应用中,数据库快照(SNAPSHOT)就是使用了行级触发器。
2. 语句级别(Statment_Level)触发器
语句级触发器对于每个处理执行一次,他们常被用于对在某个表上执行的处理类型提供额外的安全手段。语句级触发器通过命令Create trigger建立缺省触发器类型。 3. Before和After触发器
由于触发器是由事件引发的,所以他们可以被设置成在这些事件之前或之后立即触发。在触发器中,用户可以引用此处理涉及到的旧值或新值。
4. Instead of触发器
可以使用Instead of触发器来告诉Oracle应执行什么操作。
29
Company Confidential - For internal use only
触发器语法:
Create [or replace] trigger [usr.]trigger {before | after | onstead of} delete | insert | update [ of culumn [,column]…]} [or {delete | insert | update [of column[,column]…]}]… on [usr,]{TABLE |VIEW } [[referencing {old as old | new as new} …] for each {row |statement } [when (condition)]] pl/sql_block 使用示例:
create trigger onhand_bef_upd_row befor update on t_onhand for each row
when(new.quantity/old.quantity>1.1) begin
insert into t_onhand_audit
values(:old.warehouse_id, :old.item_id, :old.quantity, :old.rec_date);
end;
注意:当引用PL/SQL代码块中的关键字NEW和OLD时,必须以冒号(:)开头。在触发器中,也可使用用户自定义的例外处理。
其他操作:
激活和取消触发器:
alter trigger onhand_bef_upd_row enable(/disable); 或是:
alter table t_onhand enable(/disable) all trigger; 删除触发器:
drop tirgger onhand_bef_upd_row。 PL/SQL环境
PL/SQL是一项绑定在Oracle 数据库服务器上的技术,通过PL/SQL引擎进行传输和处理。
当一段PL/SQL块从Pro* 程序、user-exit、SQL*Plus 或是Server Manager中提交后,Oracle数据库服务器上的PL/SQL引擎就开始处理他们。PL/SQL引擎首
30
Company Confidential - For internal use only
先把块中的PL/SQL代码分成独立的若干块,在把他们传送到SQL语句执行器。这也意味着尽量采用少的PL/SQL块传输到Oracle数据库服务器,从而提高客户-服务器网络构造工作的高效性。
在许多Oracle工具中,包括 Developer/2000,拥有他们自己的PL/SQL引擎,这是完全独立Oracle数据库服务器,且在之前的引擎。 Oracle Procedure Builder的使用
结构化程序设计的最大有点在于能快速、简单的创建和调试代码,Procedure Builder 提供所有必要的功能,以利于成功开发和调试PL/SQL程序。 组要构件: 组件 对象浏览器 PL/SQL解释执行器 说明 管理PL/SQL结构,执行调试 调试PL/SQL代码,执行PL/SQL代码 创建和编辑PL/SQL代码 创建和编辑服务器端PL/SQL代码 创建和编辑数据库触发器 程序编辑器 数据库程序编辑器 数据库触发器编辑器 对象浏览器:
Program Unit: 能独立被PL/SQL编译器识别和处理的PL/SQL结构; Program Unit – Sepcification: 程序单元的名称、参数和返回类型; Program Unit – Referances: 程序单元引用的过程、函数、匿名块和表; Program Unit – Referanced By: 引用程序单元的过程、函数、匿名块和表; Libraries: 文件或数据库中PL/SQL包、过程和函数的集合; Attached Libraries: 引用的数据库或文件系统中的库; Built-in Packages : 在程序调试中可引用的PL/SQL结构单元; Debug Actions: 在程序单元调试中,可进行的监测、中断的命令; Stack: 子程序调用堆栈
Database Objects: 服务器端存储的过程、库、表和视图。 PL/SQL解释执行器:
通过使用PL/SQL解释执行器,可以定义、显示、调试和运行PL/SQL程序,同Procedure_name [(argument1 [, argument2, ….])]; 时,在PL/SQL解释执行器中,可以直接运行过程,以分号结束,如下:
31
Company Confidential - For internal use only
在PL/SQL解释执行器中,也可执行SQL DDL语句和其他命令语句。
程序编辑器:
1.
创建一个新程序单元: i. ii. iii.
选中程序单元;
点击创建按钮,弹出程序对话框窗口;
出入新建程序单元名称,并选择程序类型,点击OK键;新建程序单元显示在对象浏览器上; 在打开的程序单元内,编辑。
iv. 2.
程序编译
点击程序编辑窗口中的compile按钮,编译程序单元,编译信息在程序编辑器下方显示,包括各种出错信息或编译成功信息。
调试数据库程序:
1.
总体步骤:
i. 把数据库程序单元载入到对象浏览器中; ii. iii. iv. v.
选中要调试的程序单元; 用鼠标将其拖到程序单元中; 进行调试工作;
用鼠标间调试好程序单元拖回到原数据库单元中。
调试方法:
在PL/SQL解释执行器中调试程序,可以双击代码行,设置断点(可以设置多割断点);同时,还可以设置局部变量和参数,如下: (debug1)PL/SQL> debug.seti(?I‘,3)
程序中的参数和变量类型
参数:
参数有如下三种类型: IN Argument OUT Argument IN OUT Argument
在参数格式中,IN 可以省略,它也是缺省的形式;IN 代表该参数用于向程序中传递值,OUT代表由程序单元返回给调用它的函数值,而对于 IN
32
Company Confidential - For internal use only