3

次のような 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)
4

2 に答える 2

8

null にデフォルト設定する代わりに、省略されたパラメータ値を現実世界で決して使用しないものにデフォルト設定するのはどうですか? 使用する値は特定のドメインに属している必要があるため、そのドメイン外の値を選択してください。

例えば

PROCEDURE do_something(foo VARCHAR2 DEFAULT '*#@') IS

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

始める

IF foo = '*#@' THEN

-- I know the parm was omitted

   l_foo := NULL;

ELSE

   l_foo := foo;

END IF;

終わり;

于 2009-05-19T13:15:20.813 に答える
7

デフォルト値を使用する代わりに、プロシージャをオーバーロードできます。

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;
于 2009-05-19T12:45:28.237 に答える