包通常由如下两部分组成:
1、包规范部分:包规范部分定义了应用程序的接口,它声明了类型、常量、变量、异常、游标和可以使用的子程序声明。
2、包体部分:包体用于实现包规范部分声明的子程序和游标。
包规范的建立使用create package语句,包体的建立使用create package body语句。
/*包规范定义*/
create or replace package empsalary
as
--执行实际的加薪动作
procedure addempsalary (p_ratio number,p_empno number);
--使用if-elsif语句得到加薪比例
funtion getaddsalaryratio(p_job varchar2)
return number;
--使用case语句得到加薪比例
funtion getaddsalaryratiocase(p_job varchar2)
return number;
end empsalary;
/
/*包体定义*/
create or replace package body empsalary
as
procedure addsalary (p_ratio number,p_empno number)
as
begin
if p_ratio >0
then --判断传入的参数是否大于0
--如果大于0,则更新empt表中的数据
update ecott.emp
set sal=sal*(1+p_ratio)
where empno=p_empno;
end if;
--提示加薪成功
dbms_output.put_line('加薪成功!');
end ;
/*获取加薪比例的函数*/
function getaddsalaryratio (p_job varchar2)
return number
as
v_result number(7,2);
begin
if p_job='clerk'
then --如果为职员,加薪10%
v_result:=0.10;
elsif p_job='salesman'
then --如果为销售职员,加薪12%
v_result:=0.12;
elsif p_job='manager'
then --如果为经理,加薪15%
v_result:=0.15;
end if;
return v_result;
end;
/*使用case语句获取调薪比例的函数*/
function getaddsalaryratiocase(p_job varchar2)
return number
as
v_result number(7,2);
begin
case p_job --使用case when 语句进行条件判断
when 'clerk'
then --职员
v_result:=0.10;
when 'salesman'
then --销售
v_result:=0.12;
when 'manager'
then --经理
v_result:=0.15;
end case;
return v_result; --返回值
end;
end empsalary;/
从代码中可以看到,在包规范中,只是对子程序进行了声明,并没有包含任何实现代码。包规范中除了包含子程序外,还可以包含变量、常量及游标的定义等,在包体中包含了过程和函数的实际代码,编译并执行包创建后,包被保存到了Oracle数据字典中。