Oracle PL/SQL: package variable scope

手头的项目进行到了结合测试阶段,发现了一个比较奇怪的问题,程序运行结果正确和失败交替出现。经过仔细检查,是声明在包(package)中的变量(variable)的作用范围造成的;在同一个会话(session)中,只有第一次运行该包的存储过程时,才执行包变量的初始化,以下为测试代码:

 1 CREATE OR REPLACE PACKAGE BODY PKG_GUCS IS
 2     g_invoke_count NUMBER := 0;
 3 
 4     PROCEDURE VARIABLE_SCOPE_TEST
 5     IS
 6 
 7     BEGIN
 8 --        g_invoke_count := 0;
 9         g_invoke_count := g_invoke_count + 1;
10         DBMS_OUTPUT.put_line(g_invoke_count);
11     END VARIABLE_SCOPE_TEST;
12 
13     PROCEDURE VARIABLE_LOCAL_SCOPE_TEST
14     IS
15         l_invoke_count NUMBER := 0;
16 
17     BEGIN
18         l_invoke_count := l_invoke_count + 1;
19         DBMS_OUTPUT.put_line(l_invoke_count);
20     END VARIABLE_LOCAL_SCOPE_TEST;
21 
22 END PKG_GUCS;

在PL/SQL Developer中调用
PKG_GUCS.VARIABLE_SCOPE_TEST时,DBMS Output窗口的结果为连续变化的数字;若取消第8行的注释,则每次的结果都是1。

在几个英文网站上也看到了同样的问题,但没有找到答案,时间比较紧也没有继续搜索下去;如果哪位朋友知道比较“官方”的答案请告知,谢谢!

posted on 2006-02-10 08:49  gucs  阅读(1000)  评论(2编辑  收藏  举报

导航