Oracle PL/SQL: package variable scope
手头的项目进行到了结合测试阶段,发现了一个比较奇怪的问题,程序运行结果正确和失败交替出现。经过仔细检查,是声明在包(package)中的变量(variable)的作用范围造成的;在同一个会话(session)中,只有第一次运行该包的存储过程时,才执行包变量的初始化,以下为测试代码:
在PL/SQL Developer中调用PKG_GUCS.VARIABLE_SCOPE_TEST时,DBMS Output窗口的结果为连续变化的数字;若取消第8行的注释,则每次的结果都是1。
在几个英文网站上也看到了同样的问题,但没有找到答案,时间比较紧也没有继续搜索下去;如果哪位朋友知道比较“官方”的答案请告知,谢谢!
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;
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。
在几个英文网站上也看到了同样的问题,但没有找到答案,时间比较紧也没有继续搜索下去;如果哪位朋友知道比较“官方”的答案请告知,谢谢!