Как определить, было ли значение параметра PL / SQL по умолчанию? - PullRequest
3 голосов
/ 19 мая 2009

Предположим, у меня есть хранимая процедура PL / SQL следующим образом:

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

Теперь предположим, что do_something вызывается двумя различными способами:

/* 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)

Ответы [ 2 ]

8 голосов
/ 19 мая 2009

Как насчет того, чтобы вместо значения по умолчанию, равного нулю, по умолчанию пропущенные значения параметров были бы такими, которые вы никогда не будете использовать в реальном мире? Используемые вами значения должны принадлежать некоторому домену, поэтому выбирайте значения за пределами этого домена.

например

ПРОЦЕДУРА 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;

END; * +1011 *

7 голосов
/ 19 мая 2009

Вы можете перегрузить процедуру вместо использования значения по умолчанию:

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;
...