【问题标题】:Spooling a query containing an XMLTYPE column using sqlplus使用 sqlplus 假脱机包含 XMLTYPE 列的查询
【发布时间】:2011-03-25 11:38:12
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: oracle sqlplus spool


    【解决方案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 的行的空格价值

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

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

    【讨论】:

    • 抱歉,是的,因为输出需要在客户端而不是数据库服务器本身。
    • @copaX - 在这种情况下,您仅限于 LINESIZE 允许的 32K。
    【解决方案2】:

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

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

    【讨论】:

    • 在一天过去之前,StackOverflow 不允许我接受自己的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2019-11-13
    • 2017-02-14
    • 2018-05-22
    相关资源
    最近更新 更多