在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
由此可见,包过程是在一个会话中第一次调用时被执行,而在该会话中其他以后的调用中则不再被调用!