包的概述及使用

时间:2021-12-11 07:40:31

包的概述:
包用于逻辑组合相关的过程和函数。
它由包规范和包主体两部分组成。
(1)包规范:
用于定义共有常量、变量、过程和函数,在SQL*Plus中建立包规范中使用create package命令。

例如:
create package emp_pkg is
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
/

(2)包主体:
包规范只包含了过程和函数的说明。
包主体用于实现包规范中的过程和函数。
在包主体中使用create package body 命令。

例如:
create package body emp_pkg is
procedure update_sal(name varchar2,newsal number)
is
begin
update emp set sal = newsal
where lower(ename) = lower(name);
end;

function annual_income(name varchar2)
return nuber
is
annual_salary number(7,2);
begin
select sal*12+nvl(comm,0)
into annual_salary
from emp
where lower(ename)=lower(name);
return annual_salary;
end;
end;
/

注:当调用包的过程和函数时,在过程和函数名之前必须要带有包名作为前缀(包名.子程序名)。
而如果要访问其他方案的包,还必须要加上方案名作为前缀(方案名.包名.子程序名)。
例:

1.调用包公共变量:
exec emp_package.g_deptno := 2;

2.调用包的公共过程:
exec emp_package.add_employeeZ(111,'mary',2000);

3.调用公共函数:
var salary number;
exec :salary := emp_package.get_sal(7788);
print salary;

4.以其他用户身份调用包公共组件:用户名.包名.组件名
conn hbq/hbq;
exec hbq.emp_package.add_employee(111,'hbq',1200);

5.调用远程数据库包的公用组件:包名.组件名@数据库实例名
exec emp_package.add_employee@ora0125(111,'jack',3000);

删除包:drop package emp_package;


包重载:
1.重载是指多个(两个或两个以上)具有相同名称的子程序。
定义包时,使用重载特性,可以使用户在调用同名组件时使用不同参数传递数据,从而方便用户使用。
例:
包overload:
(1)重载函数:get_sal(eno number), get_sal(name varchar2)
(2)重载过程:fire_employee(eno number), fire_employee(name,varchar2)

2.建立包规范:
使用重载特性时,同名的过程和函数必须具有不同的输入参数。但返回值的数据类型必须完全相同。

例:
create or replace package overload is
function get_sal(eno number) return number;
function get_sal(name,varchar2) return number;
procedure fire_employee(eno number);
procedure fire_employee(name varchar2);
end;
/

3,建立包体:
当建立包体时,必须要给不同的重载过程和重载函数提供不同的实现代码。

4.调用重载函数和重载过程:
var sal1 number;
var sal2 number;

exec :sal1 = overload.get_sal('scott');
exec :sal2 = ovweload.get_sal(7369);

print sal1 sal2

exec overload.fire_employee(7369);
exec overload.fire_employee('scott');