2013-10-09 48 views
1

我寫了兩個函數,數據類型的轉換在Oracle中,並在SELECT語句中稱這些在一個巨大的表是這樣的:PL/SQL函數導致「沒有更多的數據從套接字錯誤讀」

SELECT 
safe_to_number(sid_day) sid_day, 
safe_to_number(albumid) album_id, 
safe_to_number(sid_album) sid_album, 
safe_to_number(sid_artist) sid_artist, 
safe_to_number(sid_channel) sid_channel 
FROM big_table_with_data; 

在數據庫運行一段時間後,我得到了「沒有更多數據要從套接字錯誤中讀取」,並且我需要重新啓動Oracle SQL開發人員以再次訪問數據庫。

爲什麼會出現此錯誤,並且有沒有辦法編寫PL/SQL函數來避免此錯誤?

我已經實現的功能是:

CREATE OR REPLACE FUNCTION 
safe_to_number (p varchar2) 
RETURN number 
IS 
retval number; 

BEGIN 
    IF p IS NULL THEN 
    retval := null; 
    ELSE 
    retval := safe_to_number(p); 
    END IF; 
    return retval; 

EXCEPTION 
WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Could not change value to number'); 
    retval := null; 
    return retval; 

END; 

create or replace function is_a_timestamp 
    (p_str in varchar2 
     , p_mask in varchar2) 
    return timestamp 
is 
    d date; 
begin 
    d := to_timestamp(p_str, p_mask); 
    return d; 
exception 
    when others then 
    DBMS_OUTPUT.PUT_LINE('Could not change value to timestamp'); 
    return null; 
end; 
+0

你真的是'safe_to_number()'進行遞歸調用本身,永遠不會消失?還是應該調用'to_number()'?如果這是你真正擁有的,我猜數據庫服務器會因爲耗盡資源而導致你的會話被中止...... –

+0

不,我不是故意這樣做,但我現在可以看到問題出在哪裏。謝謝您的幫助。 – olovholm

回答

3

在功能safe_to_number你遞歸調用函數本身safe_to_number線11。

這條線:

retval := safe_to_number(p); 

也許應該是:

retval := to_number(p); 
+0

謝謝,我明白爲什麼會造成問題。 – olovholm

相關問題