我写了两个函数来转换Oracle中的数据类型,并在一个巨大的表上的select语句中调用它们,如下所示:
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 :(得分:3)
在函数safe_to_number
的第11行,您递归调用函数safe_to_number
本身。
这一行:
retval := safe_to_number(p);
应该是:
retval := to_number(p);