Shell脚本中SQLPLUS输出CLOB数据重复打印问题
解决CLOB内容在导出文件中重复打印的问题
我来帮你定位和解决这个问题,通常这种重复输出的情况可以从以下几个方向排查:
1. 先确认SQL查询本身是否返回多行结果
这是最常见的原因——如果你的查询语句返回了两条(或更多)包含CLOB的记录,那输出自然会重复。
验证方法:
直接在sqlplus中手动执行你的查询语句(带上脚本里的格式设置),看看返回的行数:
sqlplus -s ${uidpwd} << EOF set head off SET pagesize 0 SET LINESIZE 32767 SET LONGCHUNKSIZE 32767 SET LONG 320000000 SET RECSEP OFF set SERVEROUTPUT off SET ECHO off SET TRIMOUT ON SET TRIMSPOOL ON set termout off set feedback off verify off heading off newpage 0 -- 替换成你的实际查询语句 SELECT FILE_DATA FROM YOUR_TABLE WHERE your_condition; EOF
如果这里输出就有两份内容,那问题出在查询逻辑上:要么表中有重复数据,要么查询条件太宽松返回了多行。你可以添加行限制,比如WHERE ... AND ROWNUM = 1(Oracle 11g及以前)或者FETCH FIRST 1 ROW ONLY(Oracle 12c+)来确保只取一行。
2. 检查SQLPLUS的输出设置是否冲突
虽然你的设置看起来大部分是对的,但有几个点需要确认:
- 确保你的SQL语句中没有使用
SPOOL命令:如果同时用了shell的重定向>和sqlplus的spool,会导致输出被写入两次文件。 - 补全
whenever SQLERROR语句:你脚本里写的whenever SQLERROR EXIT sql.SQLCOD...是不完整的,正确写法应该是whenever SQLERROR EXIT sql.sqlcode,语法错误可能导致意外的输出行为。 - 确认
SET RECSEP OFF生效:这个设置是禁止记录分隔符,避免额外的空行,但如果没生效不会导致重复内容,不过可以确保它正确设置。
3. 排查shell脚本的重复执行逻辑
检查你的ksh脚本中,这段sqlplus代码块是不是被执行了两次?比如有没有循环、条件分支导致这段代码被重复调用?或者是不是脚本里有其他地方也在向${DATA_FILE_NAME}写入内容?
4. 特殊情况:CLOB字段的输出分块问题
如果CLOB内容非常大,sqlplus的LONGCHUNKSIZE设置可能会导致内容被分块输出,但一般不会完全重复。不过你可以尝试调整LONGCHUNKSIZE和LONG的值,确保能容纳整个CLOB内容:
SET LONG 1000000000 -- 更大的数值,确保覆盖CLOB大小 SET LONGCHUNKSIZE 1000000 -- 调整分块大小
内容的提问来源于stack exchange,提问作者Pat
相关产品推荐
相关产品推荐

