2011-08-26 147 views
14

我有一個函數會返回一個類型爲my_table%ROWTYPE的記錄,並且在調用者中,我可以檢查返回的記錄是否爲空,但是PL/SQL抱怨if語句查看記錄IS NOT NULL在plsql中

PLS-00306:錯號碼或類型的呼叫參數 'IS NOT NULL'

這裏是我的代碼:

v_record my_table%ROWTYPE; 
v_row_id my_table.row_id%TYPE := 123456; 
begin 
    v_record := myfunction(v_row_id) 
    if (v_record is not null) then 
     -- do something 
    end if; 
end; 

function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is 
    v_record_out my_table%ROWTYPE := null; 
begin 
    select * into v_record_out from my_table 
    where row_id = p_row_id; 
    return v_record_out; 
end myfunction; 

感謝。

回答

22

據我所知,這是不可能的。雖然檢查PRIMARY KEYNOT NULL列應該是足夠的。


您可以檢查v_record.row_id IS NULL

雖然沒有找到記錄,但你的函數會拋出一個NO_DATA_FOUND異常。

+1

感謝您的回答。這是檢查記錄是否爲空的唯一方法嗎?我很奇怪我們可以將null分配給記錄,但不能檢查記錄是否爲空。 – Sapience

+2

據我所知,這是不可能的。雖然檢查'PRIMARY KEY'或'NOT NULL'列應該是足夠的。 –

+1

很好的解決方法!我使用'NULL'分配記錄,這是檢查的方式! +1 – gavenkoa

3

您無法測試此變量是否存在,因此有兩種方法可以解決此問題。檢查是否存在單個元素。我不喜歡這個,因爲它意味着如果有什麼改變你的代碼不再有效。相反,爲什麼不只是拋出一個異常時,有沒有數據有:

我意識到,在異常的others是非常調皮,但它會才真正趕上當它不應該,沒有別的我的表消失。

v_record my_table%ROWTYPE; 
v_row_id my_table.row_id%TYPE := 123456; 

begin 
    v_record := myfunction(v_row_id) 
exception when others then 
     -- do something 
end; 

function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is 
    v_record_out my_table%ROWTYPE := null; 

cursor c_record_out(c_row_id char) is 
select * 
    from my_table 
    where row_id = p_row_id; 

begin 
    open c_record_out(p_row_id); 
    fetch c_record_out into v_record_out; 

    if c_record_out%NOTFOUND then 
     raise_application_error(-20001,'no data); 
    end if; 
    close c_record_out; 
return v_record_out; 
end myfunction;