1

我有一个连接(手动 ||)少数列的查询,其中一个是 XMLTYPE 字段(在其上调用 getClobVal())。如果我使用带有以下选项集的 sqlplus 假脱机查询输出:

set long 30000;
set pagesize 0;
set feedback off;

我得到了所有需要的内容,但是 cr/lf 在 80 个字符之后,第一行的内容在 60 个字符和 20 个空格字符之后停止,其余行的内容在 40 个字符和 40 个空格字符之后停止。

如果我添加:

set linesize 120;

在实际内容之后使用额外的空白得到相同的结果(第 1 行有 60 个空白字符,每行剩余行有 80 个空白字符)

是否可以使用 sqlplus 和假脱机为包含大量文本的查询结果创建 csv 输出文件?

我认识到通过假脱机执行此操作不是理想的方法,但我需要能够以可以在命令行或批处理文件中执行的方式创建此 csv 文件。

有什么建议么?

4

2 回答 2

2

一位对 sqlplus 有更多经验的同事提出了以下设置块,它给了我想要的结果:

set pagesize 0 echo off;
SET LINESIZE 30000 LONG 30000 LONGCHUNKSIZE 30000 Trimspool on;
于 2010-08-05T13:39:41.573 回答
1

我们可以将 linesize 设置为一个很大的数字。多大取决于操作系统,尽管我怀疑大多数操作系统将支持高达 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' andECHO` 都设置为避免输出中的无关文本。出于同样的原因,经常设置以下参数

FEEDBACK- 控制是否在查询结束时显示行数

LONG- 控制显示的 LONG 文本
LONGCHUNKSIZE的数量 - 控制在列换行之前显示的 LONG 文本的数量 - 删除将行填充为值
TRIMSPOOL的空白LINESIZE

LONG并且LONGCHUNKSIZE应该设置为相同的值以使整列显示在单个输出行上。

所有这些参数以及更多参数都在文档中进行了解释。

于 2010-08-05T11:00:46.593 回答