程序包由PL/SQL程序元素(變量,類型)和匿名PL/SQL(游標),命名PL/SQL 塊(存儲過程和函數)組成。
程序包可以被整體加載到內存中,這樣可以大大加快程序包中任何一個組成部分的訪問速度。
程序包由規范和包主題組成:
規范:
用於規定程序包中可以使用哪些變量,類型,游標和子程序(該規范一定要在“包主體”之前被創建)
例子:
創建一個程序包“規范”,首先在該程序中聲明一個可以獲取指定部門的平均工資的函數,然后再聲明一個可以實現按照指定比例上調指定職務的工資的存儲過程
create or replace package pack_emp is
function fun_avg_sal(num_deptno number) return number; --獲取指定部門的平均工資
procedure pro_regulate_sal(var_job varchar2,num_proportion number); --按照指定比例上調指定職務的工資
end pack_emp;
/
主體:
包含了在規范中聲明的游標,過程和函數的實現代碼,還有內部變量。
創建程序包pack_emp的主體,在該主體中實現對應“規范”中聲明的函數和存儲過程:
create or replace package body pack_emp is
function fun_avg_sal(num_deptno number) return number is
num_avg_sal number;
begin
select avg(sal) into num_avg_sal from emp
where deptno=num_deptno;
return(num_avg_sal);
exception
when no_data_found then
dbms_output.put_line('該部門編號不存在雇員記錄');
return 0;
end fun_avg_sal;
procedure pro_regulate_sal(var_job varchar2,num_proportion number) is
begin
update emp
set sal =sal*(1+num_proportion)
where job=var_job;
end pro_regulate_sal;
end pack_emp;
/
調用該包中的函數和過程:
declare
num_deptno emp.deptno%type;
var_job emp.job%type;
num_avg_sal emp.sal%type;
num_proportion number;
begin
num_deptno:=10;
num_avg_sal:=pack_emp.fun_avg_sal(num_deptno);
dbms_output.put_line(num_deptno||'號部門的平均工資是:'||num_avg_sal);
var_job:='SALESMAN';
num_proportion:=0.1;
pack_emp.pro_regulate_sal(var_job,num_proportion);
end;
/