PL/SQL Developer 是我做 Oracle 开发最常用的工具,刚刚发现一个低级的 bug。下面我描述一下它:
测试的 Oracle 版本为:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
先建一个包和包体:
SQL> create or replace package pkg_test is
2
3 procedure prc_xx( v_varchar IN VARCHAR2 DEFAULT 'adsf');
4
5 end pkg_test;
6 /
程序包已创建。
SQL> create or replace package body pkg_test is
2 procedure prc_xx( v_varchar IN VARCHAR2 DEFAULT 'adsf')
3 is
4 begin
5 dbms_output.put_line('v_varchar: '||v_varchar);
6 end;
7 end pkg_test;
8 /
程序包主体已创建。
过程 prc_xx 的入参是带默认值的,对,就是测试这个。我们在 SQL*PLUS 里执行一下,没问题:
SQL> exec pkg_test.prc_xx
v_varchar: adsf
PL/SQL 过程已成功完成。
SQL> exec pkg_test.prc_xx('yuechaotian');
v_varchar: yuechaotian
PL/SQL 过程已成功完成。
换成 PL/SQL Developer 里的“test”功能看看呢?就不行啦,没有输出结果。经过测试,这个入参 v_varchar 值为 null:
SQL> create or replace package body pkg_test is
2
3 procedure prc_xx( v_varchar IN VARCHAR2 DEFAULT 'adsf')
4 is
5 begin
6 dbms_output.put_line('v_varchar'||v_varchar);
7 if v_varchar is null then
8 dbms_output.put_line('null');
9 else
10 dbms_output.put_line('not null');
11 end if;
12 end;
13 end pkg_test;
14 /
程序包主体已创建。
PL/SQL Developer 里的测试结果为:
v_varchar:
null
但如果是另写一个过程来调用 prc_xx,那么就可以使用默认值 'adsf' 了。真是奇怪,只能把原因归结为 PL/SQL Developer 的 bug
本文作者: