问题:为什么会用包?
回答:在一个大型项目中,有很多模块,每个模块都可能有很多的过程和函数,这些过程和函数默认就是放在一起,不方便查询和维护,甚至会发生误删除的事件。
所以通过使用包,就可以分类管理过程和函数。
使用包还有一个好处,就是可以在包中定义自定义类型,从而在过程和函数可以直接用于定义变量。
包的概念与java程序中包的概念是非常类似的,java程序中包也是为了分类管理不同的类,关键字都是package。
问题:如何将自定义类型、过程和函数放到包中?
回答:
如果在包中定义自定义类型,则只在包规范中定义即可。
如果在包中定义过程和函数,则使用包一共分为两步:先定义包规范,再根据包规范写实现。与java的接口有点类似,也支持重载,但是没有java的“多态”等强大的功能。
示例一:在包中定义record类型,并在匿名块中调用。
--在包中自定义类型
create or replace package my_bao
as
type emp_type is record(
gh emp.empno%type,
xm emp.ename%type,
gz emp.sal%type
);
end;
--在块中使用
declare
v1 my_bao.emp_type;
begin
select empno,ename,sal into v1 from emp where empno=7900;
dbms_output.put_line('工号='||v1.gh);
dbms_output.put_line('姓名='||v1.xm);
dbms_output.put_line('工资='||v1.gz);
end;
好处:实现的自定义类型代码的复用。
示例二:在包中定义过程hello和函数f_add(p1,p2)
--定义包规范
create or replace package my_bao
as
type emp_type is record(
gh emp.empno%type,
xm emp.ename%type,
gz emp.sal%type
);
procedure hello(p_name varchar2);
function f_add(p1 number,p2 number) return number;
end;
此时调用包中的方法:
select my_bao.f_add(1,2) from dual;
会报错,错误原因就是:包中的过程和函数没有实现。
--实现包规范,即包体(package body)。
create or replace package body my_bao
as
type emp_type is record(
gh emp.empno%type,
xm emp.ename%type,
gz emp.sal%type
);
procedure hello(p_name varchar2)
as
begin
dbms_output.put_line('hello,'||p_name);
end;
function f_add(p1 number,p2 number) return number
as
v1 number;
begin
v1:=p1+p2;
return v1;
end;
end;
--调用:
select my_bao.f_add(1,2) from dual;
返回3
call my_bao.hello('xy');
打印
hello,xy
示例三:演示包中重载方法。
强调:重载的要点就是名称一样,而参数的类型或者个数不同。
定义代码:
create or replace package my_bao
as
function f_add(p1 number,p2 number) return number;
function f_add(p1 varchar,p2 varchar) return number;
end;
create or replace package my_bao
as
function f_add(p1 number,p2 number) return number;
function f_add(p1 varchar,p2 varchar) return number;
end;
调用代码:
有了重载,调用就变得很方便,因为Oracle会根据参数的类型去自动选择。
select my_bao.f_add(1,2) from dual;
返回 3
select my_bao.f_add('1','2') from dual;
返回 12
其它问题:如何只修改包中某一个过程或函数的内容?
回答:
目前是不能的。在Oracle中,该包中过程和函数代码特别多的时候,管理起来是有点不方便,因为不能只修改包中某一个过程和函数的代码。
解决的方法是:
1、如果是在在开发中,可以利用“PLSQL Developer”工具直接先打开包,再定义某一个过程或函数直接修改就可以了。
2、如果是要给客户方人员进行发布,可以将整个包中内容发给对方。对方只管全部执行,不需要什么专业知识。
包还有一些其它的内容,但是对于常规开发,上面的知识点应该够用了。