web-dev-qa-db-ja.com

プロシージャに渡されたパラメーターを特定する(Oracle)

PL/SQLのプロシージャはパラメータのデフォルト値を持つことができますが、呼び出し元はデフォルト値と同じ値を渡すことができます。 PL/SQL内からパラメーターが渡されたかどうかを判断する方法はありますか?暗黙のとおり、これは値をデフォルト値と比較することでは実行できません。

6
Leigh Riffel

プロシージャのオーバーロードを検討する場合は、可能性があります。パラメータ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;
/
2

したがって、これを行う方法は、デフォルト値を使用しないことです。または、デフォルトでNULLに設定します。次に、プロシージャ本体内で、それがNULLに等しいかどうかを確認し、等しい場合は適切なデフォルトに設定します。その時点で、同じスペースで1つまたは2つのフラグを壊して、何が設定されているかどうかを確認できます。

ただし、なんらかの理由でNULLを渡そうとした場合のEdgeケースがあります。ただし、ほとんどの開発者はトリプレットケースをうまく処理しないため、通常はそのことを心配しません(さらに、値を渡す場合は、nullではなく値を渡す必要があるため、nullは決して意味しません-定義された)

6
jcolebrand