在一个大型项目中,可能有很多模块,而每个模块又有自己的过程、函数等。而这些过程、函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起的,即Procedures中),这些非常不方便查询和维护,甚至会发生误删除的事件。所以通过使用包就可以分类管理过程和函数。
而且在包中还可以自定义自定义类型,从而在过程和函数中可以直接使用自定义变量。Oracle中包的概念与JAVA中包的概念非常类似,只是JAVA中的包是为了分类管理类,但是关键字都是package。
包分两部分,包规范和包体。
包定义
create or replace
PACKAGE MyPackage1 AS
TYPE re_stu IS RECORD
(
rname emp.ename%type,
rage emp.empno%type
);
type c_stu is ref cursor;
FUNCTION MyFunction(num1 NUMBER,num2 NUMBER) RETURN NUMBER;
PROCEDURE MyProcedure(cid in varchar2,c_st out c_stu);
END MyPackage1;
包体实现
create or replace
PACKAGE BODY MYPACKAGE1 AS
FUNCTION MyFunction(num1 NUMBER,num2 NUMBER) RETURN NUMBER
AS
num NUMBER(10,2):=0;
BEGIN
num:=num1+num2;
return num ;
END;
PROCEDURE MyProcedure(cid in varchar2,c_st out c_stu)
AS
r_stu re_stu;
BEGIN
open c_st for select ename , empno from emp where empno = cid;
loop
fetch c_st into r_stu;
exit when c_st%notfound;
dbms_output.put_line('姓名='||r_stu.rname);
end loop;
END;
END MYPACKAGE1;
包在pl下调用
declare
c_stu MyPackage1.c_stu; --定义包中游标变量
r_stu MyPackage1.re_stu; --定义包中结构体变量
num number;
begin
--使用及遍历包中过程返回的结果集
MyPackage1.MyProcedure('8001',c_stu);
loop
fetch c_stu into r_stu;
exit when c_stu%notfound;
dbms_output.put_line('姓名='||r_stu.rname);
end loop;
--使用包中的方法
select MyPackage1.MyFunction(5,6) into num from dual;
dbms_output.put_line('Num='||num);
end;