2012-08-16 47 views
1

我正在寫一個使用OCI調用存儲過程的C++程序。在我的PL/SQL存儲過程測試中,如果沒有初始化一個出站變量,我可能會得到"fetched column value is NULL"錯誤,因爲在foo != 0的情況下,bar是NULL。所以在第一行中,我首先初始化欄。這是處理出站變量的正確方法嗎?PL/SQL初始化出站變量?

FUNCTION function1(
    foo IN INTEGER, 
    bar OUT VARCHAR2 
) RETURN INTEGER 
    IS 
    ret  INTEGER; 
    BEGIN 

    bar := ' '; -- do I need to initialize this variable? 

    IF foo = 0 THEN 
     ret := 0; 
     bar := 'a'; 
    ELSE 
     ret := 1; 
    END IF; 

    RETURN ret; 

    END function1; 
+0

當你的函數中沒有'select'(即'fetch')時,你如何獲得一個'fetched column value Null'錯誤?和'bar:='';'不是必需的,但是你可以將它作爲'bar:= NULL;' – Annjawn 2012-08-16 16:21:39

+0

在C++中執行的sql命令看起來像是'BEGIN \ n:ret:= function1(:foo,:bar ); END;'即使沒有選擇語句,它也會出錯。我再次測試它,做'bar:= NULL;'也會導致同樣的錯誤! – Stan 2012-08-16 16:51:49

+0

你有沒有嘗試初始化變量,如上面的代碼所示,並且這樣做是否消除了錯誤? – 2012-08-16 17:13:56

回答

1

如果你沒有在你的程序中設置BAR,那麼這個變量將包含你在調用function1()之前的任何值。這只是基本的邏輯。

那麼你的選擇是:

  1. 設置BAR爲默認值的程序流進入IF語句之前。
  2. 將BAR設置爲IF語句每個分支中的適當值。

您發佈的代碼使用第一個選項。在你呈現的簡單邏輯中,這是我將採取的方法。如果內部結構更復雜 - 一個IF或一個包含許多分支的CASE - 我會選擇讓每個分支明確地設置該值,因爲這可能會使代碼的意圖更清晰。

+0

bar是一個OUT參數,這意味着在函數調用開始時它將爲NULL。不是「你調用function1()」之前的任何值。 – 2012-08-21 07:58:11

+0

@JeffreyKemp - 很對。我碰巧一直在使用IN OUT參數,並且我的行爲在大腦中。 – APC 2012-08-21 11:26:36