一、概念
包类似于java中的接口,包中的过程与函数是只有名字没有sql块(代码)。要通包体来实现包中的过程与函数。
作用:
1.将有联系的对象打成包,方便使用
• 1 包说明和包体必须有相同的名字
• 2 包的开始没有begin语句,与存储过程和函数不同。
• 3 在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。
• 4 在包内声明常量、变量、类型定义、异常、及游标时不使用declare。
• 5 包内的过程和函数的定义不要create or replace语句。
• 6 包声明和包体两者分离。
二、创建包的语法
Create[ or replace] package 包名
IS
Procedure过程名[(参数.....)];
Function函数名[(参数.....)]
Return数据类型;
End;
/
2.案例
请编写一个包,
该包中有一个过程:可以接收用户名和薪水,(将用于通过用户名去更新薪水)
还有一个函数,该函数可以接收下个用户名,(将用来实现 得到该用户的年薪是多少)
create package my_pac
is
procedure my_pro(v_name varchar2,v_sal number);
function my_fun(v_name varchar2)
return number;
end;
/
三、创建包体
语法:
1.注意:包体的名字,一定要与上面创建的包名一样。
Create[ or replace] package body 包名
Is
Procedure 过程名[(参数.....)]
Is
Begin
执行语句;
End;
Function 函数名[(参数.....)]
Return 数据类型
Is
定义变量;
Begin
执行语句;
End;
End;
/
--创建包体
代码:
create or replace package body my_pac --创建包体名
is
procedure my_pro(v_ename varchar2,v_sal number) --覆写包的过程
is --一些是实现过程的方法
begin
update emp set sal=v_sal where ename=v_ename;
end;--结束
function my_fun(v_ename varchar2)--覆写包的函数
return number
is --以下是实现函数的过程
v_sal emp.sal%type;
begin
select (sal + nvl(comm,0))*12 into v_sal from emp where ename=v_ename;
return v_sal;
end;--结束
end;
/
调用包体语法:
Exec 包名.过程名(参数....);
Call 包名.过程名(参数....)调用函数语法: Select 包名.函数名 from dual;