使用sqlplus假脱机包含XMLTYPE列的查询

时间:2010-08-04 20:27:22

标签: oracle sqlplus spool

我有一个查询连接(手动由||)一些列,其中一列是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文件。

有什么建议吗?

2 个答案:

答案 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

的空格

LONGLONGCHUNKSIZE应设置为相同的值,以便在单个输出行上显示整列。

the documentation中解释了所有这些参数以及更多参数。

答案 1 :(得分:0)

对sqlplus有更多经验的同事提出了以下设置块,它给了我正在寻找的结果:

set pagesize 0 echo off;
SET LINESIZE 30000 LONG 30000 LONGCHUNKSIZE 30000 Trimspool on;