我有一个查询连接(手动由||)一些列,其中一列是XMLTYPE字段(在其上调用getClobVal())。如果我使用sqlplus使用以下选项设置查询输出:
set long 30000;
set pagesize 0;
set feedback off;
我可以根据需要获得所有内容,但是在80个字符后使用cr / lf,第一行的内容在60个字符后停止,其中包含20个字符的空格,其余行的内容在40个字符后停止,其中包含40个字符的空格。
如果我添加:
set linesize 120;
我在实际内容之后有额外的空格得到相同的结果(第1行的空白60个字符,每行剩余行的空格80个字符)
是否可以使用sqlplus和假脱机为包含大量文本的查询结果创建csv输出文件?
我认识到通过假脱机执行此操作并不是理想的方法,但我需要能够以可在命令行或批处理文件上执行的方式创建此csv文件。
有什么建议吗?
答案 0 :(得分:1)
我们可以将lineize设置为一个大数字。有多大取决于操作系统,虽然我怀疑大多数操作系统将支持高达32K。这是来自Windows ....
SQL> set linesize 10000
SQL> set linesize 32767
SQL> set linesize 999999
SP2-0267: linesize option 999999 out of range (1 through 32767)
SQL>
如果你的XML文本比这长,那么你运气不好。
您没有说明为什么使用SQL * Plus。这是因为您想要在客户端而不是数据库服务器上输出,或者因为您不知道任何其他方式来写出文件?
如果你可以写信给服务器,还有其他选择。 UTL_FILE的行数限制仍然是32767个字符,但至少我们已经做了一些程序化的向导,以确保该行不会在中间标记中被切断。
然而,最好的解决方案可能是使用DBMS_XSLPROCESSOR.CLOB2FILE(),这是XMLDB功能的一部分。
为了完整起见,copaX的同事推荐的相关SQL * Plus参数是:
PAGE
- 将此值设置为零会抑制标题并阻止输出中的页面抛出
ECHO
- 控制脚本运行时是否显示SQL语句
两个PAGE' and
ECHO`都设置为避免输出中的无关文本。出于同样的原因,通常会设置以下参数
FEEDBACK
- 控制是否在查询结尾处显示行计数
LONG
- 控制显示的LONG文本数量
LONGCHUNKSIZE
- 控制列包装前显示的LONG文本数量
TRIMSPOOL
- 删除哪些权限将该行填充到LINESIZE
值
LONG
和LONGCHUNKSIZE
应设置为相同的值,以便在单个输出行上显示整列。
the documentation中解释了所有这些参数以及更多参数。
答案 1 :(得分:0)
对sqlplus有更多经验的同事提出了以下设置块,它给了我正在寻找的结果:
set pagesize 0 echo off;
SET LINESIZE 30000 LONG 30000 LONGCHUNKSIZE 30000 Trimspool on;