UNIX环境下Oracle如何导出超过32767字符的长字符串?
嘿,这个问题我熟!你脚本里的long 32767和longchunksize 32767就是罪魁祸首——它们直接限制了CLOB/LONG类型字段的输出长度,超过32767的部分自然会被截断。
解决起来很简单,只要把这两个参数调整到能容纳你的最长字符串就行,同时配套调整linesize避免行宽不够导致的意外截断。下面是修改后的关键部分:
修改后的脚本片段
#!/bin/sh . . sqlplus -s $USER/$PWD@$SID <<ENDSQL > $SQLOUT set trimout on set trimspool on set HEAD OFF set TAB OFF set FEED OFF set echo off SET TERMOUT OFF -- 把行宽调大,确保单行能放下最长的字符串 set linesize 100000 -- 设置long为你需要的最大长度(比如50000,Oracle 9i及以上支持到2000000000) long 50000 -- longchunksize和long保持一致,保证大字段完整输出 longchunksize 50000 pagesize 0 WHENEVER SQLERROR EXIT 1; spool $EXPORT_FILE -- 这里放你的查询语句,比如SELECT your_long_clob_column FROM your_table; spool off EXIT; ENDSQL
额外要注意的点
- 如果你的字符串比100000还长,继续往上调
linesize就行——spool到文件的时候,对行宽的限制比终端宽松很多,一般操作系统都能支持。 - 要是你还在使用Oracle 8i或更早的老版本,
long参数的最大值确实是32767,这时候就得用分段读取的方式,比如借助DBMS_LOB.SUBSTR函数把大字段拆成多段再拼接:
这种方式需要根据你的最大字符串长度算清楚要拆多少段,每段最多32767字符。SELECT DBMS_LOB.SUBSTR(your_clob_column, 32767, 1) || DBMS_LOB.SUBSTR(your_clob_column, 32767, 32768) || DBMS_LOB.SUBSTR(your_clob_column, 32767, 65536) FROM your_table; - 最后检查下你的查询语句,别加了多余的格式化或者截断函数,不然还是会丢内容。
内容的提问来源于stack exchange,提问作者swet




