2008-11-13 139 views
1

我有一個關於Oracle中PL/SQL函數默認值的簡短問題。以這個程序爲例,Oracle默認值

create or replace 
FUNCTION testFunction 
(
    varNumber IN NUMBER DEFAULT 0 
) 
RETURN NUMBER 
AS 
BEGIN 
    dbms_output.put_line(varNumber); 
    RETURN varNumber; 
END; 

這裏是如果對varNumber沒有指定值時,該函數被調用的想法,那麼它就會採取0

現在的價值,我的問題是,我的功能都可以從所謂的一個Web服務層,它將始終作爲參數的值傳入NULL,而參數的值沒有值。 Oracle將NULL解釋爲一個值,因此不會將varNumber初始化爲其默認值0.

我可以看出爲什麼這種方法有意義,但我想知道是否有方法來覆蓋此行爲,並使其成爲如此如果傳遞NULL值,它會導致Oracle分配在函數頭中指定的顯式DEFAULT值?

我也考慮過做手工檢查的選項...

IF(varNumber IS NULL) THEN 
    varNumber := 0; 
END IF; 

不過,也有數以百計的功能,在這可能是一個問題,更不用說大量的每個函數的參數,等等如果我能找到更一般的解決方案,我更喜歡它。

歡迎您提供任何見解。

回答

2

您不能將值分配給IN參數,但可以將它們設置爲IN/OUT然後設置它們。不過,這會產生濫用和混淆的巨大潛力。

所以我認爲你會用局部變量做得更好。但你可以在聲明中做到這一點。也就是,

create or replace 
FUNCTION testFunction 
(
    varNumber IN NUMBER DEFAULT 0 
) 
RETURN NUMBER 
AS 
    vFix number := nvl(varNumber,0); 
BEGIN 
    dbms_output.put_line(vFix); 
    RETURN vFix; 
END; 
4

使用NVL定義值。

NVL(value_in, replace_with) 
1

您的手動檢查是安全地做你想做的事情的唯一方法。

你可以寫在這樣雖然一行:

varNumber = NVL(varNumber,0); 

祝你好運!