1. 程式人生 > >包的概述及使用

包的概述及使用

cot end upd 返回值 代碼 employee pac log begin

包的概述:
包用於邏輯組合相關的過程和函數。
它由包規範和包主體兩部分組成。
(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‘);

包的概述及使用