当前位置: 代码迷 >> SQL >> PL/SQL温习十二 包
  详细解决方案

PL/SQL温习十二 包

热度:306   发布时间:2016-05-05 13:58:22.0
PL/SQL复习十二 包

--建立包规范

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不能读取包变量

?

  相关解决方案