1.包的主要构成
包包括包的规范和包体
包的规范:就是规范了包的接口,而包体则是实现包规范的具体内容。
实例如下:
包的规范:
create or replace package emp_package is
g_deptno number(3) := 30;
procedure add_employee(eno number,name varchar2,salary number,dno number default g_deptno);
procedure fire_employee(eno number);
function get_sal(eno number) return number;
end emp_package;
包体:
create or replace package body emp_package is
function validate_deptno(v_deptno number) --- 定义私有函数
return boolean
is
v_temp int;
begin
select 1 into v_temp from dept where deptno = v_deptno;
return true;
exception
when no_data_found then
return false;
end;
procedure add_employee(eno number,name varchar2,salary number,
_dno number default g_deptno) ---对应包规范的公有过程
is
begin
if validate_deptno(dno) then
insert into emp(empno,ename,sal,deptno) values(eno,name,salary,dno);
else
raise_application_error(-20010,'该部门不存在');
end if;
exception when dup_val_on_index then
raise_application_error(-20011,'该雇员已存在');
end;
procedure fire_employee(eno number) is ---对应包规范的公有过程
begin
delete from emp where empno = eno;
if SQL%NOTFOUND then
raise_application_error(-20012,'该雇员不存在');
end if;
end;
function get_sal(eno number) return number ---对应包规范的公有函数
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = eno;
return v_sal;
exception when no_data_found then
raise_application_error(-20013,'该雇员不存在');
end;
end emp_package;
2.包的调用
1.包体内调用
2.调用公用包变量
SQL> exec emp_package.g_deptno := 20;
3.调用公用包的过程
SQL> exec emp_package.add_employee(1111,'MARY',2000);
SQL> exec emp_package.add_employee(1112,'CLARK',2000,10);
4.调用公用包的函数
SQL> var salary number;
SQL> exec :salary := emp_package.get_sal(7788);
5.以其他用户调用公用包组件
SQL> exec bms.emp_package.add_employee(1115,'scott',1200);
6.调用远程数据库包的公用组建
SQL>exec emp_package.add_employee@orasrv(1116,'SCOTT',1200);
7.查看包源代码
SQL> select * from user_source where name = 'EMP_PACKAGE' and type = 'PACKAGE';
8.删除包
drop package emp_package;