Oracle Spool输出被拆分多含空白行,求排查配置问题
SQL*Plus Spool输出被拆分多行且含空白行的问题排查
这问题我碰到过好多次,咱们一步步来拆解原因和解决方案:
首先先看你当前的SQL*Plus配置:
set colsep , set pagesize 0 set trimspool on set trim on set headsep off set feedback off set echo off set timing off set termout off set linesize 4000 SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WORD_WRAPPED SET LONG 2000000000 SET SQLFORMAT ANSICONSOLE
以及你得到的异常输出:
2010123100001001574964||||||5000053895489|||||BUILD|19-AUG-16|||||||||||||| ||||||||||||||23-MAR-15|||||||30-DEC-14|||||SJONDUS||DJKSKIKIYN|| 2012123100001000780125||||||5000018234592|||||BUILD|19-AUG-16|||||||||||||| ||||||||||||||23-MAR-15|||||||23-NOV-14|||||SAMPLEFILE||samplethief||
问题根源
核心是两个配置的冲突和不合理设置:
SET SQLFORMAT ANSICONSOLE:这个格式是专门为终端交互设计的,它会忽略你设置的linesize,强制把输出适配终端窗口宽度,导致长行被自动拆分。SET SERVEROUTPUT ... FORMAT WORD_WRAPPED:虽然这个主要影响PL/SQL块的输出,但WORD_WRAPPED的自动换行逻辑会和其他配置叠加,加剧行拆分的问题。
另外,缺少两个关键配置来抑制空白行和强制不换行。
修正后的配置
把配置改成下面这样,就能解决问题:
set colsep , set pagesize 0 set trimspool on set trim on set headsep off set feedback off set echo off set timing off set termout off set linesize 4000 SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT TRUNCATED -- 替换WORD_WRAPPED为TRUNCATED,或直接去掉FORMAT项 SET LONG 2000000000 SET SQLFORMAT CSV -- 如果需要分隔符输出用CSV,不需要就设为DEFAULT或删掉此行 set wrap off -- 强制关闭自动换行,确保一行数据不被拆分 set newpage none -- 彻底消除空白行的产生
调整说明
- 替换/移除
ANSICONSOLE:换成CSV(匹配你用colsep ,的需求)或者DEFAULT,让linesize 4000真正生效,不再自动换行。 - 修改
SERVEROUTPUT的FORMAT:TRUNCATED只会截断超长文本而不会换行,避免干扰正常的spool输出;如果不需要PL/SQL输出的格式控制,甚至可以直接去掉FORMAT部分。 - 新增
wrap off:从根本上禁止SQL*Plus对长行进行自动拆分。 - 新增
newpage none:防止SQL*Plus在页与页之间插入空白行,解决输出中的空白行问题。
调整后重新执行spool操作,应该就能得到你想要的2行完整数据,不会再有拆分和空白行了。
内容的提问来源于stack exchange,提问作者kashi
相关产品推荐
相关产品推荐

