/* oracle 包 (package)*/
/*
包用于逻辑组合相关的pl/sql类型,项和子程序,由包规范 和 包体组成
实际上包是用于与应用程序的接口。
《1》包的例子
1.创建包类型
create or replace package emp_package is
g_deptno number(3) := 30;
procdure add_employee(eno,number,name varchar2,
salary number,dno number default g_deptno);
function get_sal(eno number) return number;
end emp_package;
/
2.实现包体emp_package
create or replace package body emp_package
is
-- validate_deptno 为包体私有方法,可以内部被直接调用
function validate_deptno(v_deptno) return boolean
is
v_temp int;
begin
select 1 into v_temp from dept t where t.deptno=v_deptno;
return true;
exception
when not_data_found then
return false;
end;
end;
--实现包类型 存储过程add_employee
procdure add_employee(eno,number,name varchar2,salary number,dno 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(-20201,'不存在该部门!');
end if;
exception
when dup_val_on_index then
raise_application_error(-20201,'该雇员已经存在!');
end;
end;
-- 实现包类型 get_sal 方法
function get_sal(eno number) return number
is
begin
...............
end;
end;
-- 可以在命令行 调用公共存储过程 :exec emp_package.add_employee(111,'tom',9999,10);
-- 在命令行调用 包公共函数 ; var sal number;
exec sal :=emp_package.get_sal(10);
《2》使用包重装
重载是指多个具有多个相同名称的子程序(使用不同的参数传递数据);
1.在重载函数时同名函数返回的数据类型必须完全相同。
eg
create or replace package emp_overload is
max_sal number(8,2);
min_sal number(8,2);
function get_sal(eno number) return number;
function get_sal(name varchar2) return numnber;
end;
《3》使用包构造过程
在包中定义了全局变量后,有些会话中,可能需要初始化全局变量,在一个会话中,第一次调用公共组件时,会自动执行其存储过程,
并且构造过程在同一会话中只能被执行一次
包的构造过程被放在包体的最后。并且没有任何名称,只是一个块
create or replace package emp_overload is
function get_sal(eno number) return number is
begin
............
end;
function get_sal(name varchar2) return numnber is
begin
......................
end;
--构造方法初始化全局变量 min_sal,max_sal
begin
select min(sal),max(sal) into min_sal,max_sal from emp ;
end;
end;
《4》使用纯度级别
当使用包的公共函数时,它既可以作为包的一部分使用,也可以作为表达式的一部分使用,也可以作在sql 语句中使用,
但如果要在sql 中引用包的公共函数,那么该公共函数不能包含dml 语句(insert,update,delete),也不能读取远程的变量,
为了对包的公共函数进行限制,在定义包规范是将使用纯度级别(purity level)限制公共函数。
1.wnds ; 用于限制函数不能修改数据
2.wnps ; 用于限制函数不能修改包变量
3.rnds ; 用于限制函数不能读取数据库数据
4.rnps ;用于限制函数不能读取包变量
eg
create or replace package emp_purity is
min_sal number(8,2);
max_sal number(8,2);
function get_maxsal return number;
function get_minsal return number;
-- prama restrict_references 用于纯度级别限制
prama restrict_references(get_maxsal wnds);
prama restrict_references(get_minsal wnds)
end;
*/
oracle 包 (package)
最新推荐文章于 2024-09-18 21:33:30 发布