PL/SQLのプロシージャはパラメータのデフォルト値を持つことができますが、呼び出し元はデフォルト値と同じ値を渡すことができます。 PL/SQL内からパラメーターが渡されたかどうかを判断する方法はありますか?暗黙のとおり、これは値をデフォルト値と比較することでは実行できません。
プロシージャのオーバーロードを検討する場合は、可能性があります。パラメータa
にデフォルトの5を、パラメータb
に7を設定し、パラメータが渡されたかどうかも確認するとします。この場合、(パラメーターありとパラメーターなし)の組み合わせごとに、手順を4回オーバーロードする必要があります。最後に、実物がprivateプロシージャで発生します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;
/
したがって、これを行う方法は、デフォルト値を使用しないことです。または、デフォルトでNULLに設定します。次に、プロシージャ本体内で、それがNULLに等しいかどうかを確認し、等しい場合は適切なデフォルトに設定します。その時点で、同じスペースで1つまたは2つのフラグを壊して、何が設定されているかどうかを確認できます。
ただし、なんらかの理由でNULLを渡そうとした場合のEdgeケースがあります。ただし、ほとんどの開発者はトリプレットケースをうまく処理しないため、通常はそのことを心配しません(さらに、値を渡す場合は、nullではなく値を渡す必要があるため、nullは決して意味しません-定義された)