You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c PL/SQL拼接超长字符串触发Socket连接断开问题

问题分析与解决方案:Oracle 19c PL/SQL拼接长字符串触发"No more data to read from socket"

问题根源

你遇到的是Oracle 19c EE的PL/SQL解析器bug:当通过多次||拼接生成超过2277字符的字符串并赋值给varchar2(4000 char)或CLOB变量时,数据库解析拼接表达式的过程中出现异常,导致会话直接断开。直接赋值长字符串正常,说明变量容量本身无问题,问题出在多片段拼接的解析逻辑上。

可行解决方案

1. 改用DBMS_LOB.APPEND处理CLOB拼接

如果目标变量是CLOB,放弃||拼接,使用Oracle内置的LOB操作函数,绕开解析器的拼接逻辑问题:

DECLARE
    l_temp_clob CLOB;
BEGIN
    -- 创建临时CLOB
    DBMS_LOB.CREATETEMPORARY(l_temp_clob, TRUE);
    
    -- 分段追加内容
    DBMS_LOB.APPEND(l_temp_clob, '第一部分长内容');
    DBMS_LOB.APPEND(l_temp_clob, '第二部分长内容');
    DBMS_LOB.APPEND(l_temp_clob, '后续所有需要拼接的片段');
    
    -- 使用处理后的CLOB
    -- ...
    
    -- 释放临时CLOB
    DBMS_LOB.FREETEMPORARY(l_temp_clob);
END;
/

2. 拆分拼接链,减少单次拼接的片段数量

将多个小片段先合并为几个中等长度的中间变量,再进行最终拼接,降低解析器需要处理的拼接复杂度:

DECLARE
    l_final_str VARCHAR2(4000 CHAR);
    l_segment1 VARCHAR2(2000 CHAR);
    l_segment2 VARCHAR2(2000 CHAR);
BEGIN
    -- 先拼接成两个大段
    l_segment1 := '片段1' || '片段2' || '片段3' || '片段4' || '片段5';
    l_segment2 := '片段6' || '片段7' || '片段8' || '片段9' || '片段10';
    
    -- 最终拼接
    l_final_str := l_segment1 || l_segment2;
END;
/

3. 逐段追加而非一次性拼接

将多片段拼接拆分为多次赋值操作,每次只追加一个片段到结果变量中,避免生成超长的拼接表达式:

DECLARE
    l_result VARCHAR2(4000 CHAR);
BEGIN
    l_result := '初始内容';
    l_result := l_result || '追加片段1';
    l_result := l_result || '追加片段2';
    l_result := l_result || '追加片段3';
    -- 依次追加所有需要的内容
END;
/

4. 升级Oracle补丁

这个问题属于19c的已知bug,建议登录Oracle Support知识库,搜索关键词No more data to read from socket PL/SQL string concatenation,找到对应的补丁编号后为数据库打补丁,从根源上解决问题。

内容的提问来源于stack exchange,提问作者ZeRoOo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:22:27