oracle 包 简单使用
_冥想 人气:0理解PL/SQL包
简介
包(package)的主要作用是用于逻辑组合相关的PL/SQL类型
比如记录类型或者集合类型,PL/SQL游标或游标声明以及PL/SQL子程序
还可以包含任何可以在块的声明区中定义的变量
或者说是
将功能或业务相似的存储过程,函数
以及类型等进行一个封装
包的组成
一个PL/SQL包由如下两部分组成
包规范(包声明)
包规范: 主要是包的一些定义信息,不包含具体的代码实现部分
也可以说包规范是PL/SQL程序和其他应用程序的接口
包含类型,记录,变量,常量,异常定义,游标和子程序的声明包体
包体是对包规范中声明的子程序的实现部分
包体的内容对于外部应用程序来说是不可见的
包体就像是一个黑匣子一样,是对包规范的实现
包的优点
1模块化设计
通过将逻辑相关的类型,常量,变量,异常和子程序放到一个命名的
pl/sql模块中,使得每一个包都容易理解,有助于模块化程序的开发
使得包与包之间的接口简单,清晰2规范化的程序设计
在基于包的应用程序设计时,可以首先规划并在包规范中定义包需要提供的功能
即便当前并没有实现包体,也可以编译包规范部分
然后引用该包的存储子程序会被编译3实现信息的隐藏
包规范中定义的常量,变量和异常及子程序等时公有的,可以被外部访问
可以规划将哪些内容公开给外部进行调用
如果不想对外公开,可以在包体中定义这些内容,这样就可以实现信息的隐藏4提供全局共享的附加功能
在包中公开的变量或游标在一个会话期会一直存在
因此可以将包中定义的变量当做全局变量来使用5提供了良好的性能体验
由于在首次打开包子程序时,整个包都会被加载到内存中
因而后续的调用只需要从内存中读取而不需要再次读取磁盘,
提供了较好的性能
包规范
语法
create or replace package 包名
is
--声明变量
--声明常量
--类型的定义
--游标的定义
--声明存储过程
procedure 存储过程名[(参数 in|out|in out 类型,..)];
--声明函数
function 函数名[(参数 类型,...)] return 返回值类型;
end[包名];
创建一个包规范
create or replace package pk1
is
--声明一个变量
s varchar2(50);
--声明一个常量
T constant varchar2(10):='TAB_';
--定义一个集合类型
type ity is table of varchar2(30);
--声明一个存储过程
procedure p1;
--声明函数
function fn(n number) return number;
end pk1;
包体
语法
create or replace package body 包名
is
--声明私有对象
--声明私有变量
--声明私有常量
--私有函数或存储过程
--公有对象的实现
end[包名];
注意:
包名,和包声明的名字一样
私有对象只能在包体内部调用,在最前面声明
创建一个包体
create or replace package body pk1
is
--声明变量
ss varchar(50);
--乘法表
procedure p1
is
begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(i||'*'||j||'='||i*j);
end loop;
dbms_output.put_line('');
end loop;
end;
--阶乘
function fn(n number) return number
is
--声明一个变量保存阶乘
s number(10) :=1;
begin
for i in 1..n loop
s:=i*s;
end loop;
return s;
end;
end;
调用
调用1
begin
pk1.s:=3;
dbms_output.put_line(pk1.s);
end;
输出1
3
调用2
begin
pk1.ss:=3;
dbms_output.put_line(pk1.ss);
end;
输出2
ORA-06550: 第 2 行, 第 7 列:
PLS-00302: 必须声明 'SS' 组件
变量ss在包体中声明,外部程序不能访问
调用3
begin
pk1.p1();
end;
输出3
1*1=1
2*1=22*2=4
3*1=33*2=63*3=9
4*1=44*2=84*3=124*4=16
5*1=55*2=105*3=155*4=205*5=25
6*1=66*2=126*3=186*4=246*5=306*6=36
7*1=77*2=147*3=217*4=287*5=357*6=427*7=49
8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64
9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81
调用&&输出4
SQL> select pk1.fn(4) from dual;
PK1.FN(4)
----------
24
加载全部内容