2009-05-19 59 views
3

假設我有一個PL/SQL存儲過程如下:如何確定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) 
+0

爲什麼你想區分這些情景?畢竟,foo不會具有相同的價值嗎? – Petros 2009-05-19 12:41:02

+0

彼得羅斯,希望我最近的編輯將有助於澄清我爲什麼這樣做。 – 2009-05-19 13:03:19

+0

在我看來你真的是第二種「NULL」 - 例如「UNCONSTRAINED」或「未知」 - 您可以使用魔術值作爲默認值,但我的首選是明確創建包裝過程 - 如果有很多,可以編寫腳本來生成它們。 – 2009-05-20 02:44:34

回答

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

怎麼樣,而不是defaultin g爲空,默認的省略參數值是你永遠不會在現實世界中使用的東西?您使用的值應該屬於某個域,因此請選擇該域之外的值。

例如

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;