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 里的测试结果为:
但如果是另写一个过程来调用 prc_xx,那么就可以使用默认值 'adsf' 了。真是奇怪,只能把原因归结为 PL/SQL Developer 的 bug。