轉自:http://hi.baidu.com/andyloolu/blog/item/a64f0ed12cc10738960a165a.html
在Oracle中,可以定義包變數。
關於包變數的使用,不少的人不是很清楚。首先我們看如下的例子:
CREATE OR REPLACE PACKAGE ds_test AS
procedure proc1;
END ds_test;
/
CREATE OR REPLACE PACKAGE BODY ds_test AS
n number:=0;
procedure proc1
is
begin
n:=n+1;
dbms_output.put_line('n='||n);
end proc1;
END ds_test;
/
執行如下的指令碼,其輸出的結果是什麼呢?
BEGIN
DS_TEST.PROC1;
DS_TEST.PROC1;
DS_TEST.PROC1;
DS_TEST.PROC1;
END;
呵呵執行結果是:
n=1
n=2
n=3
n=4
這說明什麼問題呢,這也就是說ORACLE中的Package酒相當於我們java中的一個class,在啟動並執行時候被執行個體化,因此其中包變數就像是該執行個體中的執行個體變數一樣。在Oracle中對包一個會話調用中,包變數是該會話中的“全域”變數。
當然,在Oracle Package中,也可以定義包過程,其中很簡單。比如將入行的包體修改一下:
CREATE OR REPLACE PACKAGE BODY ds_test AS
n number:=0;
procedure proc1
is
begin
n:=n+1;
dbms_output.put_line('n='||n);
end proc1;
begin
n:=n+100;
END ds_test;
/
那麼執行上述指令碼後的結果是什嗎?
執行後的結果是:
n=101
n=102
n=103
n=104
由此可見,包過程是在一個會話中第一次調用時被執行,而在該會話中其他以後的調用中則不再被調用!