PL / SQLのパラメータ値がデフォルトで設定されたかどうかはどのように決めるのですか?

StackOverflow https://stackoverflow.com/questions/882466

質問

次のように私は、PL / SQLストアド・プロシージャがあるとします:

PROCEDURE do_something(foo VARCHAR2 DEFAULT NULL) IS
BEGIN
    /* Do something */
END;

さて、と仮定するdo_somethingは、2つの異なる方法が呼び出されます

/* Scenario 1: The 'foo' parameter defaults to NULL */
do_something();

/* Scenario 2: The 'foo' parameter is explicitly set to NULL */
do_something(foo => NULL)

どのように私はそれを呼び出すされているシナリオを決定するためにdo_something手順を定義することができますか?

編集:この手順のために私の意図を明確化:

FUNCTION find_customer(name VARCHAR2 DEFAULT NULL, number VARCHAR2 DEFAULT NULL) RETURN NUMBER IS
BEGIN
    /* Query the "customer" table using only those parameters provided */
END;

以下は例である関連するSQL句を使用してこの手順を使用して、所望の

/* SELECT * FROM customer WHERE customer.name = 'Sam' */
find_customer(name => 'Sam')

/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number = '1588Z' */
find_customer(name => 'Sam', number => '1588Z')

/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number IS NULL */
find_customer(name => 'Sam', number => NULL)

/* SELECT * FROM customer WHERE customer.name IS NULL */
find_customer(name => NULL)

/* SELECT * FROM customer WHERE customer.name IS NULL AND customer.number IS NULL */
find_customer(name => NULL, number => NULL)
役に立ちましたか?

解決

あなたはデフォルト値を使用しての手順を代わりに過負荷になる可能性があります:

PROCEDURE do_something(foo VARCHAR2) IS
BEGIN
    /* Do something */
END;

PROCEDURE do_something IS
BEGIN
    /* here you know: no argument. Then call do_something(null) */
END;

他のヒント

どの程度の代わりにヌルをデフォルトの、あなたは現実の世界で使用することは決してありません何かに省略したパラメータをデフォルト値?あなたが使用する値はようにドメイン外の値を選択するいくつかのドメインに属している必要があります。

など

PROCEDUREのdo_something(FOO VARCHAR2のDEFAULT '*#@')がIS

l_foo  VARCHAR2(32000); -- local copy of foo parm

BEGIN

IF foo = '*#@' THEN

-- I know the parm was omitted

   l_foo := NULL;

ELSE

   l_foo := foo;

END IF;

END;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top