Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
a. publish、private、locavariable 三種類型,當然每種類型包括了變量、函數、類型等。
b. publish類聲明在非包體中(不帶body的)
private類聲明在包體中
locavariable類聲明在包中函數、過程對象裡面的
a. publish類,包外可以使用,可以進行取值、賦值操作,每次使用本變量時,包體中的begin-end模塊會被初始化,同時此類變量生存周期是會話的生存周期,當包被重新編譯,此變量將被重新初始化,否則只初始化一次。
b. private類,包外不可以使用,作用域限定待包體中(帶body的),生存周期是會話周期,周期內只被初始化一次,當包被重新編譯,此變量將被重新初始化
c. locavariable類變量,作用域是在函數、過程等對象用,與一般函數變量聲明一致。
包中的begin-end模塊,在每次調用包的時候都需要進行初始化運行。
3. 測試demo
創建測試包
create or replace package testpkg is
-- Author : ZHENGZY
-- Created : 2013/5/21 9:57:02
-- Purpose : 測試包的特性
-- Public constant declarations
Cons_Varchar constant varchar2(100) := 'TestPkg';
-- Public variable declarations
V_GlobVarchar varchar2(1000) := '1000';
V_Globinteger INTEGER;
-- Public function and procedure declarations
function fc_IncNumAndConnStr return varchar2;
end testpkg;
create or replace package body testpkg is
-- Private constant declarations
Cons_Varchar2 constant varchar2(100) := 'TestPkgPrivate';
-- Private variable declarations
V_GlobVarchar2 varchar2(1000);
V_Globinteger2 INTEGER;
-- Function and procedure implementations
function fc_IncNumAndConnStr return varchar2 is
V_Result varchar2(2000);
begin
V_globvarchar := V_globvarchar ||' HELLO';
V_globinteger := NVL(v_globinteger,0) + 1;
V_Globinteger2 := nvl(V_Globinteger2,0) + 1;
V_Result :='V_Globvarchar=' ||V_Globvarchar||to_char(v_globinteger) || chr(13) ||
'V_globVarchar2=' ||V_globVarchar2 ||chr(13)||
'V_globVarchar3='||to_char(V_Globinteger2);
return(V_Result);
end;
begin
V_globVarchar2 := V_globVarchar2||'body ini.';
end testpkg;
create or replace package testpkg2 is
-- Created : 2013/5/21 10:18:46
-- Purpose : 測試公共變量
-- Public function and procedure declarations
function fc_setvaluetovar return varchar2;
end testpkg2;
create or replace package body testpkg2 is
function fc_setvaluetovar return varchar2 is
result varchar2(200);
begin
testpkg.V_GlobVarchar := testpkg.V_GlobVarchar|| 'hello';
result := testpkg.V_GlobVarchar;
return(Result);
end;
begin
null;
end testpkg2;
執行語句:
SELECT TESTPKG.FC_INCNUMANDCONNSTR FROM DUAL; SELECT TESTPKG2.FC_SETVALUETOVAR FROM DUAL;
首次執行結果:
V_Globvarchar=1000 HELLO1 V_globVarchar2=body ini. V_globVarchar3=1 -- 1000 HELLOhello
第二次結果:
V_Globvarchar=1000 HELLOhello HELLO2 V_globVarchar2=body ini. V_globVarchar3=2
1000 HELLOhello HELLOhello