Oracle学习笔记第十八天
包
概念: 程序包是对相关存储过程、函数、变量、游标和异常等对象的封装,由规范和主体两部分组成。
规范:声明程序包中公共的对象,包括类型、变量、常量、异常、游标规范和子程序规范等。
主体:声明程序包私有对象和实现在包规范中声明的子程序和游标。
-- 语法
-- 包头
CREATE [OR REPLACE] PACKAGE package_name
IS|AS
[Public item declarations] -- 变量、常量、游标、数据类型声明 --公共变量声明
[Subprogram specification] --子程序(过程、函数)声明
-- 类似java中的接口,这里声明子程序的入参和出参,但是并没有详细说明怎么处理
END [package_name]; -- package name 可写可不写
-- 包体
CREATE [OR REPLACE] PACKAGE BODY package_name
IS|AS
[Private item declarations] -- 定义私有变量,这个和java类似。
[Subprogram bodies] -- 这里类似java的实现类,之前在包头中定义的子程序,这里写具体怎么实现。
[BEGIN
Initialization] -- Oracle包的奇特之处,这里是给包头的公有变量赋值,这个位置在最后。
END [package_name]; -- package name 可写可不写
-- 示例
---创建包头
create or replace package mypkg
is
--定义公共变量
v_minsal emp.sal%type;
--定义游标规范
type my_cur_type is ref cursor;
--定义过程规范
procedure proc_emp(v_sals out my_cur_type);
--定义子程序规范
function get_emp_sal(v_empno emp.empno%type)
return emp.sal%type;
end mypkg;
---创建包体
create or replace package body mypkg
is
--定义私有变量
v_maxsal emp.sal%type;
--定义子程序的主体
function get_emp_sal(v_empno emp.empno%type)
return emp.sal%type
is
v_sal emp.sal%type;
begin
select e.sal into v_sal
from emp e
where e.empno = v_empno;
--返回查询结果
return v_sal;
end;
--定义过程的主体
procedure proc_emp(v_sals out my_cur_type)
is
begin
open v_sals for select sal from emp;
end;
---初始化公共变量
begin
select min(sal) into v_minsal from emp;
end mypkg;
------调用包中的函数
select mypkg.get_emp_sal(7788) from dual;
------调用包中的过程
set serveroutput on;
declare
v_sals mypkg.my_cur_type; --定义返回值的变量
v_sal emp.sal%type; --保存从游标中提取的数据
begin
mypkg.proc_emp(v_sals);
loop
fetch v_sals into v_sal;
exit when v_sals%notfound;
dbms_output.put_line('工资:'||v_sal);
end loop;
close v_sals;
end;
/
程序包中的游标
静态游标:
游标的定义分为游标规范和游标主体
包规范中声明游标规范是必须使用return 子句指定游标的返回类型。
动态游标
在包规范中声明自定义游标类型
**注意:不能在包主体中声明游标变量 **
程序包的管理
-- 语法
DROP PACKAGE [BODY] package_name;-- 删除程序包
ALTER PACKAGE package_name COMPILE [PACKAGE|BODY] -- 编译