Lei*_*fel 6 oracle oracle-11g-r2 plsql
PL/SQL 中的过程可以有参数的默认值,但调用者可以传递与默认值相同的值。有没有办法从 PL/SQL 内部确定是否传递了参数?正如暗示的那样,这不能通过将值与默认值进行比较来完成。
所以我这样做的方式是我不使用默认值。或者更确切地说,我将它们设置为 NULL 作为默认值。然后在我的程序主体中,我检查它是否等于 NULL,如果是,则将其设置为合理的默认值。在这一点上,您可以在同一空间中处理一两个标志,以查看正在设置或未设置的内容。
但是,如果他们出于某种原因打算传入 NULL,则存在边缘情况。但是,大多数开发人员都不能很好地处理三元组,所以我通常不担心(另外,如果我传递一个值,我需要传递一个值,而不是 null,所以 null 对我来说意味着永远 -被定义)
如果您考虑重载过程,这可能是可能的。假设您希望参数默认为 5 a
,参数默认为 7 b
,并且还想检查参数是否已传递。在这种情况下,您必须为每个组合(带参数和不带参数)使过程重载 4 次。最后,真正的事情发生在私有过程中p_
:
set serveroutput on size 100000 format wrapped
create or replace package tq84_test_pck as
procedure p;
procedure p(a number );
procedure p( b number);
procedure p(a number, b number);
end tq84_test_pck;
/
create or replace package body tq84_test_pck as
procedure p_(a number := 5, a_default boolean,
b number := 7, b_default boolean) as
begin
dbms_output.put_line(
'a: ' || a ||
case when a_default then ' [default]'
else ' [passed ]' end);
dbms_output.put_line(
'b: ' || b ||
case when b_default then ' [default]'
else ' [passed ]' end);
dbms_output.new_line;
end p_;
procedure p is
begin
p_(a_default => true,
b_default => true);
end p;
procedure p (a number) is
begin
p_(a => a,
a_default => false,
b_default => true);
end p;
procedure p (b number) is
begin
p_(b => b,
a_default => true,
b_default => false);
end p;
procedure p (a number, b number) is
begin
p_(a => a,
b => b,
a_default => false,
b_default => false);
end p;
end tq84_test_pck;
/
show errors
declare
begin
tq84_test_pck.p;
tq84_test_pck.p( b => 7);
tq84_test_pck.p( a => 7 );
tq84_test_pck.p( a => null);
tq84_test_pck.p( a => 5, b => 6);
end;
/
Run Code Online (Sandbox Code Playgroud)