PL / SQL函数导致“无法从套接字错误读取数据”

时间:2013-10-09 13:30:45

标签: sql oracle function plsql

我写了两个函数来转换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;

1 个答案:

答案 0 :(得分:3)

在函数safe_to_number的第11行,您递归调用函数safe_to_number本身。

这一行:

retval := safe_to_number(p);

应该是:

retval := to_number(p);