1.包:
包是过程、函数、变量、常量、类型和游标等PL/SQL程序设计元素的组合。包的组成部分:包(包头)和包的实现(包体)。
2.注意的几点:
(1)先定义包,再实现包。
(2)包体中的函数名、过程名和包头中的函数名、过程名相同。
(3)包中没有begin。
(4)在包体中进行声明时不用declare。
(5)在包体中实现函数和过程时不要create orreplace。
(6)包头与包体分离。
3.一个实例
(1)定义包
create package pack1 is
procedure pro1(in_empno in emp.empno%type);
function fun1(in_empno in emp.empno%type) return number;
end;
(2)定义包体
create package body pack1 is
p_comm number(7,2);
--实现存储过程
procedure pro1(in_empno in emp.empno%type) is
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
select ename,sal into v_ename,v_sal from emp where empno = in_empno;
dbms_output.put_line('员工号为:'||in_empno||'员工姓名为'||v_ename||'员工薪水为'||v_sal);
end;
--实现存储函数
function fun1(in_empno emp.empno%type)
return number is
v_comm emp.comm%type;
begin
select nvl(comm,0) into v_comm from emp where empno = in_empno;
return v_comm;
end;
end;
(3)调用包中的函数和过程
begin
pack1.pro1(7499);
dbms_output.put_line('员工号是7499的员工奖金为'||pack1.fun1(7499));
end;
4.java中调用包的一个实例
(1)定义包
create package pack2 is
type cur_emp is ref cursor;
procedure pro_1(in_deptno in emp.deptno%type,out_cur_emp out cur_emp);
end;
(2)定义包体
create package body pack2 is
procedure pro_1(in_deptno in emp.deptno%type,out_cur_emp out cur_emp) is
begin
open out_cur_emp for select *from emp where deptno = in_deptno;
end;
end;
(3)java中调用包
String sql = "{call pack2.pro_1(?,?)}";
cs = ct.prepareCall(sql);
cs.setInt(1, 10);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.execute();
rs = ((OracleCallableStatement) cs).getCursor(2);
if(rs!=null){
while(rs.next()){
System.out.println("员工号是"+rs.getString(1)+"名字是"+rs.getString(2)+"薪水是"+rs.getString(6));
}
}