没有更多数据要从套接字读取

Ani*_*ket 5 oracle plsql oracle11g

我的程序看起来像这样:

Declare 
       cur_1        Sys_Refcursor;
       cur_2        Sys_Refcursor;
       v_1          VARCHAR2(30);
       v_2          VARCHAR2(30);
       v_3          VARCHAR2(30);
       v_4          VARCHAR2(30);
Begin
       OPEN cur_1 for Select * from tab1@dblink1;
       Loop
           Fetch cur_1 into v_1, v_2;
           EXIT WHEN cur_1%NOTFOUND;   
           OPEN cur_2 for Select * from tab2@dblink1 where col1 = v_1 and col2 = v2;
           Loop
               Fetch cur2 into v_3, v_4;
               Exit when cur_2%notfound;    
               INSERT INTO local.tab3 values (v_1,v_2, v_3, v_4);
           END Loop;
           close cur_2;
       End Loop;
       close cur_1; 
END;
Run Code Online (Sandbox Code Playgroud)

abobe程序编译,但是当我运行它时,我得到以下错误:

没有更多的数据从套接字读取
没有更多的数据从套接字读取
没有更多的数据从套接字读取
没有更多的数据从套接字读取
没有更多的数据从套接字读取
没有更多的数据从套接字读取
没有更多的数据从套接字读取
无从套接字中读取更多数据
......(几乎没有'从套接字读取更多数据')

IO错误:通过对等方重置连接:套接字写入错误
进程已退出.

有趣的是,当我注释掉整个内循环时,程序运行没有错误.所以我知道内部循环有问题(我尝试只在内部循环中注释insert语句并得到相同的错误).

我的localdbdblink1数据库都有相同的版本:

Oracle Database 11g企业版11.2.0.1.0版 - 64位生产

PL/SQL版本11.2.0.1.0 - 生产

核心11.2.0.1.0生产

适用于64位Windows的TNS:版本11.2.0.1.0 - 生产

NLSRTL版本11.2.0.1.0 - 生产

Jon*_*ler 5

解决“没有更多数据可从套接字读取”错误的一般建议。

这些错误通常是由另一个严重错误引起的,例如 ORA-600 错误。问题非常严重,导致服务器进程崩溃,甚至无法向客户端发送正确的错误消息。(这些错误的另一个常见原因是 SQLNET.EXPIRE_TIME 或某些其他杀死旧会话的进程导致网络断开。)

查看警报日志以找出原始错误消息。

在此目录中查找文件alert_[name].log:select value from v$parameter where name = 'background_dump_dest';

找到具体的错误消息和详细信息后,请访问 support.oracle.com。使用“ora-600工具”,然后查找ORA-600消息后的第一个数字。

通常会有一篇或多篇文章针对该特定类型的 ORA-600 错误。使用确切的版本和平台来缩小可能的错误列表。(但是,如果本文中的“受影响的版本”是错误的,请不要感到惊讶。Oracle 声称的“已在版本 xy 中修复”并不总是正确的。)

这些文章通常更详细地解释问题是如何发生的、可能的解决方法以及通常涉及修补或升级的解决方案。

在实践中你很少想解决这些问题。“典型”建议是联系 Oracle 支持以验证您是否确实存在相同的问题、获取补丁、获得许可并关闭环境,然后应用补丁。然后可能会意识到补丁不起作用。恭喜你,你浪费了很多时间。

相反,您通常可以通过对查询或过程进行细微更改来避免该问题。Oracle 有很多功能,几乎总是有另一种方法来实现。如果代码最终看起来有点奇怪,请添加注释以警告未来的程序员:“此代码看起来很奇怪,以避免错误 X,该错误应该在版本 Y 中修复。”

针对此代码的具体建议

如果这确实是您的整个过程,您应该将其替换为以下内容:

insert into local.tab3(col1, col2, col3, col4)
select tab1.col1, tab1.col2, tab2.col1, tab2.col2
from tab1@dblink1 tab1
join tab2@dblink1 tab2
    on tab1.col1 = tab2.col1
    and tab1.col2 = tab2.col2;
Run Code Online (Sandbox Code Playgroud)

一般来说,如果可能的话,您应该始终使用 SQL 执行操作。特别是如果您可以避免打开许多游标。特别如果您可以避免打开远程数据库的许多游标。

  • 如果您在任一数据库的日志中都找不到错误消息,我猜这是一个网络错误。当我使用数据库链接进行即席查询时,有时会出现类似的错误,使会话长时间打开,并且某些网络超时会终止连接。但我不知道如何解决此类问题。 (2认同)