1建立包
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_empoyee(eno number);
function get_sal(eno number) return number;
end emp_package;
2) 建立包体
用于实现包规范所定义的过程和函数。在包体中也可以单独定义私有组件,包括变量,常量,过程和函数等。但在包体中所定义的组件只能在包内使用,而不能由其他子程序引用。
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);
esle
raise_application_error(-20011,'部门不存在');
end if;
exception
when dup_val_on_index then
raise_application_error(-20011,'该雇员已存在')
end;
procedure fire_employee(eno number) is
begin
select 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(-200012,'');
end;
end emp_package;
3) 调用包组建
-- 在同一个包内调用组建 不需要加包名前缀,直接调用
create or replace paclage body emp_package is
procedure add_employee(eno number,name varchar2,salary number,dno number default g_deptno)
is
begin
validate_deptno(dno) then
exception
end;
-- 调用包公用变量
exec emp_package.g_deptno:=20
-- 调用公用过程
exec emp_package.add_employee(111,'mary,2000');
-- 调用远程数据库包的公用组件
exec
emp_paclage.add_employee@orasrv(1116,'scott',1200);
4) 查看包源代码
select text from user_source where name='emp_package' and type='package';
5) 删除包
drop packagee emp_package;
2 使用包重载
指多个具有相同名字的子程序,在调用的时候使用不同的参数传递。
1) 建立包规范
同名过程和函数必须具有不同的输入参数,但同名函数返回值的类型数据必须相同
create or replace package overload is
function get_sal(eno number) return number;
function get_sal(name varchar2) return number;
procedure fire_employee(eno number);
procedure fire_employee(name varchar2);
2) 建立包体
。。。
3) 使用包构造过程
初始化全局变量
1 建立包规范
create or replace packiage emp_package
is
minsal number(6,2);
maxsal number(6,2);
procedure upd_sal(eno number,salary number);
procedure upd_sal(name varhcar2,salary number);
end;-- 定义了两全局变量和三个公用过程
2 建立包体
create or replace package body emp_package is
procedure add_employee(cno number,name varchar2,salary number,dno number)
is
begin
if salary between minsal and maxsal then
insert into emp(empno,ename,sal,deptno)
........
-- 构造过程,位于子程序尾部,已begin 开始已end 结束
begin
select min(sal),max(sal) into minsal,maxsal from emp;
end;
end;
3 调用包公用组建
在同一次会话中第一次调用包的公用组建时,会自动执行其它构造函数,而将来调用其他组建时则不会再调用其构造过程。
4 使用纯度级别
1 家里包规范
create or replcace package purity is
minsal number(6,2);
maxsal number(6,2);
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal,wnps);--wnps 不能修改包的变量(不能给包的变量赋值) --wnds 不能执行dml
pragma restrict_references(min_sal,wnps);--rnps 用于限制函数不能读取包变量
end;