3

假设我有一个 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)
4

2 回答 2

8

与其默认为 null,不如将省略的参数值默认为您在现实世界中永远不会使用的值,怎么样?您使用的值应该属于某个域,因此请选择该域之外的值。

例如

过程 do_something(foo VARCHAR2 DEFAULT '*#@') 是

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 回答