理解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
