Presentation is loading. Please wait.

Presentation is loading. Please wait.

第三章:包   包(package)是一个可以将相关对象存储在一起的PL/SQL结构。包包含了两个分离的部件------包说明(specification)和包主体(body)。每个部件都单独被存储在数据字典中。包只能存储在数据库中,不能是本地的。除了可以将相关对象作为一组存在一起以外,包也是十分有用的,因为它们在依赖性方面的限制是比较小的。也有许多性能上的优点。

Similar presentations


Presentation on theme: "第三章:包   包(package)是一个可以将相关对象存储在一起的PL/SQL结构。包包含了两个分离的部件------包说明(specification)和包主体(body)。每个部件都单独被存储在数据字典中。包只能存储在数据库中,不能是本地的。除了可以将相关对象作为一组存在一起以外,包也是十分有用的,因为它们在依赖性方面的限制是比较小的。也有许多性能上的优点。"— Presentation transcript:

1 第三章:包 包(package)是一个可以将相关对象存储在一起的PL/SQL结构。包包含了两个分离的部件------包说明(specification)和包主体(body)。每个部件都单独被存储在数据字典中。包只能存储在数据库中,不能是本地的。除了可以将相关对象作为一组存在一起以外,包也是十分有用的,因为它们在依赖性方面的限制是比较小的。也有许多性能上的优点。

2 1.包的组成 将相关的若干程序结构组织到一块,用一个包来标识这个集合。 程序单元 描述
将相关的若干程序结构组织到一块,用一个包来标识这个集合。 程序单元 描述 ____________________________________________________ 过程(procedure) 带有参数的程序 函数(Function) 带有参数的程序,该程序只返回一个 变量(Variable) 用于存储变化值的存储单元 游标(Cursor) 指向一个 SQL语句的指针 常量(Constant) 指向常数的指针 异常情况(Exception) 标志一个异常情况

3 包说明是操作接口,对应用可见;包主体是黑盒,对应用隐藏实现细节

4 包由说明部分和包主体两部分组成,在包的说明部分说明的元素(过程、函数等)是公共元素,只在包主体中说明的元素是私有元素。
元素的性质 描 述 在包中的位置 公共的(public) 在整个应用的全过 包的说明部分说明, 程均有效 并在包主体中具体定 义它 私有的(private) 对包以外的过程和 在包主体部分说明 函数是不可见的 和定义 局部的 只在一个过程或函 在所属过程或函数的 数内部可用 内部说明和定义

5 注释: ● 标识符(变量、游标、常量、异常处理)可以是公共、私有或局部的。
● 程序(过程、函数)可以是公共的或私有的。 ● 标识符(变量、游标、常量、异常处理)可以是公共、私有或局部的。 在包说明部分说明的所有对象在包的外面都是可用的并且是可见的。只需指定该包的名字就可以访问该对象了。

6

7 2.开发包 按下述步骤开发一个包,注意这和过程的开发相似。 ●在一个文本文件中写入 CREATE PACKAGE 语句 以说明一个包。
按下述步骤开发一个包,注意这和过程的开发相似。 ●在一个文本文件中写入 CREATE PACKAGE 语句 以说明一个包。 ●用 CREATE PACKAGE BODY语句创建包体。 ● 在 SQL*plus或 SVRMGR中运行这两个文本文件, 以将包的源代码编译成编译代码(P-Code),并将这 两种代码存人数据库中。 ●从ORACLE环境,或者从一个独立的函数或过程调 用一个包内的公共元素。

8 注释: ●也可将 CREATE PACKAGE语句和 CREATE PACKAGE BODY语句 写入同一个文本文件中。

9

10 ★ 创建包说明的语法: CREATE [OR REPLACE] PACKAGE [模式名.]包名 {IS | AS} PL/SQL块 包说明
CREATE [OR REPLACE] PACKAGE [模式名.]包名 {IS | AS} PL/SQL块 包说明 例1: CREATE OR REPLACE PACKAGE emp_actions AS PROCEDURE hire_employee(ename CHAR ...); PROCEDURE fire_employee(emp_id NUMBER ...); FUNCTION … END emp_actions; /

11 例2:制作一个包说明 生成一个管理雇员薪水的包,其中包括一个为雇员加薪的过程,并且在包中还有一个记录所有雇员薪水增量的全局变量。
生成一个管理雇员薪水的包,其中包括一个为雇员加薪的过程,并且在包中还有一个记录所有雇员薪水增量的全局变量。 CREATE PACKAGE sal_package IS PROCEDURE raise_sal(v_empno emp.empno%TYPE, v_sal_increment emp.sal%TYPE); v_delta_sal emp.sal%TYPE; END sal_packages;

12 ★ 创建包主体的语法: CREATE [OR REPLACE] PACKAGE BODY [模式名.]包名{IS | AS} PL/SQL包说明

13 CREATE OR REPLACE PACKAGE BODY emp_actions AS
例: CREATE OR REPLACE PACKAGE BODY emp_actions AS PROCEDURE hire_employee(ename CHAR ...) BEGIN 过程语句 END hire_employee; PROCEDURE fire_employee(emp_id NUMBER ...) END emp_actions; /

14 在创建公共过程时使用私有过程可以使代码模块化和清晰化。可以在包主体的开始定义一个私有过程,以初始化所有全局变量。
例子:制作一个包体。 创建一个私有函数以简化过程 RAISE_SAL的代码,同时创建一个用来初始化全局变量 V_DELTA_SAL的过程。

15 CREATE PACKAGE BODY sal_paCkage IS
FUNCTION get_sal(v_empno emp.empno%type) Return number Is V_empsal emp.sal%type:=0; Begin Select sal Into v_empsal From emp Where empno=v_empno; Return(v_empsal); End;

16 PROCEDURE raise_sal(v_empno emp.empno% TYPE,
v_sal_increment emp.sal%TYPE) IS v_old_sal emp.sal% TYPE; BEGIN v_old_sal:=get_sal(v_empno); UPDATE emp SET sal=sal十v_sal_increment WHERE empno=v_empno; COMMIT WORK; v_delta_sal:=v_delta_sal十v_sal_incrernent; END raise_sal; END sal_package; /

17 注意:包说明部分是必需的,而包主体部分是可选的。
注释: ● 包中 NUMBER型变量缺省初始化值为0, VARCHAR2型变量缺省初始化值为空。 注意:包说明部分是必需的,而包主体部分是可选的。 过程和函数的说明在包说明和包主体部分应该是 相同的。包括过程、函数的名字、参数的名字以 及参数的模式。

18 3.包的管理 包的存储和一个单独的过程存储一样。 内 容 命令 创建一个新的包说明信息 CREATE PACKAGE
包的存储和一个单独的过程存储一样。 内 容 命令 创建一个新的包说明信息 CREATE PACKAGE 创建一个新的包主体 CREATE PACKAGE BODY 修改一个已有的包的说明 CREATE OR REPLACE PACKAGE 修改一个已有的包主体 CREATE OR REPLACE PACKAGE BODY 删除包的说明和包主体 DROP PACKAGE 删除包主体 DROP PACKAGE BODY

19 注释: ●当包的说明被删除或修改时,一般要求把包主体也 删除或做相应修改。 ●当删除或修改包主体时,可以不删除或修改包的说 明。
●当包的说明被删除或修改时,一般要求把包主体也 删除或做相应修改。 ●当删除或修改包主体时,可以不删除或修改包的说 明。 在管理包时,整个包(包括其中所有的元素)是作为一个逻辑单元进行管理的,其管理命令和方法都与管理单个过程相同。

20 任务 包 独立过程 文档记录 在数据字典视图 在数据字典视图 USER_SOURCE中 USER_SOURCE中 检查编译错误 在数据字典视图 在数据字典视图 USER_ERRORS中 USER_ERRORS中 开发方法 利用 SQL*Plus 利用 SQL* Plus批文件 批文件 开发权限 需要 CREATE 需要 CREATE PROCEDURE PROCEDURE 系统权限 系统权限  使用权限 需要对包有EXECUTE 需要对过程有EXECUTE 实体特权 实体特权

21 注释: ●用 DBMS_OUTPUT系统包中的过程来调试包中的过程。

22 4.包的调用 ● 从另一个存储子程序调用 emp_actions.hire_employee(name…); ● 从ORACLE工具中调用
SQL> EXECUTE emp_actions.hire_employ(…); ● DB链路名

23 注释: 例子:调用一个公共过程。给7654号雇员加薪$100。
SQL> EXECUTE sal_package.raise_sal(7654,100); 注释: ● 利用包名可以使一个用户的两个不同过程有相同的 名字。 在一个用户对话中可以从任何独立过程中引用包中的公 共变量、游标、常量和异常情况。

24 注释: 例子:调用包中的变量。当某部门整个薪水的变化超过予算 的,发一条警告信息。 ● 引用包中的变量时,在它前面加上包的名字。
例子:调用包中的变量。当某部门整个薪水的变化超过予算 的,发一条警告信息。 CREATE PROCEDURE warn_sal(v_sal_budget IN emp.sal%TYPE) IS BEGIN IF sal_package.v_delta_sal>v_sal_budget THEN RAISE_APPLICATION_ERROR(-20400, ‘Salary budget exceeded.’); END IF; END warn_sal; 注释: ● 引用包中的变量时,在它前面加上包的名字。

25 5.包的依赖性 与独立过程一样,尽管包也有自动管理本地依赖性和远程依赖性的机制,但仍建议用户对那些无效的包进行手动地重新编译。

26 任务 包 独立过程 记录文档 在数据字典的 在数据字典的 DEPENDENCIES DEPENDENCIES 视图里 视图里 手动重新编译 用 ALTER PACKAGE 用 ALTER 命令 PROCEDURE命令 自动重新编译 取决地本地、远程依 取决于本地、远程依 赖性的自动管理机制 赖的自动管理机制

27 ★ 语法——重新编译包体和包说明的定义 ALTER PACKAGE—package name—COMPILE PACKAGE ★ 语法——重新编译包体 ALTER PACKAGE—package name—COMPILE PACKAGE BODY 其中: package name 指包的名字

28 注释: ● 当重新编译包说明的定义时,必须对包体重新编译。 ● 当只重新编译包体时,不一定要重编译包说明的定义。

29 ★ 在独立过程中使用包中的元素 如果只改变包主体的定义,而不改变包的说明的定义,那么不影响包主体外的独立过程的有效性。
如果只改变包主体的定义,而不改变包的说明的定义,那么不影响包主体外的独立过程的有效性。 如果改变对包主体说明的定义,则包主体和包外的过程都将是无效的,因为它们都依赖于对包主体说明的定义。

30

31 ★ 在包中涉及到一个独立过程 如果该独立过程改变了,那么包主体将会无效,但包的说明定义仍然有效。

32

33 ★ 包的依赖性的自动管理机制 ● 当包的定义发生改变以后,ORACLE 把所有调用该包的其他包的状态置为无效。
●    当包的定义发生改变以后,ORACLE 把所有调用该包的其他包的状态置为无效。 ●    当用户调用的包的状态发生遗失时,ORACLE将发生一个运行错误。 ●    当包被再次调用时,ORACLE再次说明该包,并初试化变量和游标。

34 6.包的优点 包除了能规范化应用开发程序以外,还有以下优点: ★ 方便对存储过程和函数的组织 ● 将相关的过程和函数组织在一起。
包除了能规范化应用开发程序以外,还有以下优点: ★ 方便对存储过程和函数的组织 ● 将相关的过程和函数组织在一起。 ● 在一个用户的环境中解决命名的冲突问题。

35 ★ 方便对存储过程和函数的管理 ● 在不改变包的说明定义时可以改变包体的定 义。 ● 限制过程依赖性。 ★ 方便了对存储过程和函数的安全性管理 ● 整个包的访问权限只需一次性授权。 ● 区分共用过程和私有过程。

36 ★ 为用户对话提供状态确认信息 ● 在各种环境和过程中均可引用标识符。 ● 在用户的整个对话中保留标识符的状态。 ★ 改善性能 ● 在包被首次调用时,作为一个整体全部调入内存。 ● 减少多次调用时的磁盘 I/O次数。

37

38


Download ppt "第三章:包   包(package)是一个可以将相关对象存储在一起的PL/SQL结构。包包含了两个分离的部件------包说明(specification)和包主体(body)。每个部件都单独被存储在数据字典中。包只能存储在数据库中,不能是本地的。除了可以将相关对象作为一组存在一起以外,包也是十分有用的,因为它们在依赖性方面的限制是比较小的。也有许多性能上的优点。"

Similar presentations


Ads by Google