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