--建立包规范
create or replace package emp_package
is
g_deptno number(3) := 30; --全局变量
procedure add_employee( ? --过程
?? eno in number,
?? name in varchar2, ?
?? salary in number,
?? dno in number default g_deptno
);
procedure fire_employee(eno in number); --过程
function get_sal(eno in number) return number; --函数
end emp_package;
/
--建立包体
create or replace package body emp_package
is
??function validate_deptno(v_deptno in 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 in number,
?? ? name in varchar2, ?
?? ? salary in number,
?? ? dno in 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 in number) is ?--过程
??begin
?? ?delete from emp where empno = eno;
?? ?if sql%notfound then
?? ? ?raise_application_error(-20012,'该雇员不存在');
?? ?end if;
??end;
??function get_sal(eno in 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(-20012,'该雇员不存在');
??end;
end emp_package;
/
调用:
调用包变量:SQL> exec emp_package.g_deptno := 20;
调用包过程:SQL> exec emp_package.add_employee(1111,'lixin',2000);
调用包函数:
SQL> var salary number;
SQL> exec :salary := emp_package.get_sal(7788);
?
PL/SQL procedure successfully completed
salary
---------
3000
以其他身份调用包的公共组件:
SQL> exec lixin.emp_package.add_employee(1236,'lixin2',20);
远程调用包组件:
SQL> exec [email protected](1236,'lixin2',20);
---------------------------------------------------------------
包纯度级别:
create or replace package my_package is
minsal number;
maxsal number;
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal,wnps);
pragma restrict_references(min_sal,wnps);
end;
/
wnps:不能修改变量
wnds:不能修改数据库
rnds:不能读取数据库
rnps不能读取包变量
?