【问题标题】:PL/SQL functions leads to "No more data to read from socket error"PL/SQL 函数导致“No more data to read from socket 错误”
【发布时间】:2013-10-09 13:30:44
【问题描述】:

我在 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; 

数据库运行一段时间后,出现“No more data to read from socket 错误”,我需要重新启动 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;

【问题讨论】:

  • 你真的是说safe_to_number() 永远递归地调用自己吗?还是应该调用to_number()?如果这是你真正拥有的,我猜数据库服务器正在杀死你的会话,因为它耗尽了资源......
  • 不,我不是故意的,但我现在知道问题出在哪里了。感谢您的帮助。

标签: sql oracle function plsql


【解决方案1】:

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

这一行:

retval := safe_to_number(p);

应该是:

retval := to_number(p);

【讨论】:

  • 谢谢,我明白为什么会出现问题了。
猜你喜欢
  • 2012-12-01
  • 2010-11-18
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多