【问题标题】:PL/SQL dbms_output adding extra Carriage Return in CLOBPL/SQL dbms_output 在 CLOB 中添加额外的回车
【发布时间】:2019-04-11 22:59:15
【问题描述】:

当使用 dbms_output 放置一个带回车的 clob 时,它会插入一个额外的换行符,这会创建额外的换行符,在 SQL*Plus 中运行它并使用 spool 捕获它时可以看到这些换行符。正在使用的数据库是 Oracle 11g。例如,运行这个:

SET HEADING OFF
SET FEEDBACK OFF
SET ECHO OFF SET
VERIFY OFF SET
TRIMOUT ON SET
TRIMSPOOL ON
SET SERVEROUTPUT ON

SPOOL ./TestResult.txt

-- Spooling direct select for comparing results
SELECT 'line 1'||CHR(13)||CHR(10)||'line 2' FROM DUAL;

declare
  l_clob clob;
begin
  l_clob := 'line 1'||chr(13)||chr(10)||'line 2';
  dbms_output.put_line(l_clob);
end;
/

SPOOL OFF

生产:

line 1
line 2

line 1

line 2

底层换行符如下:

[CR][LF]
line 1[CR][LF]
line 2[CR][LF]
[CR][LF]
line 1[CR]
[CR][LF]
line 2[CR][LF]
[CR][LF]

作为补充说明,上面的代码是说明我的问题的简化示例。实际上,CRLF 行跳转来自我无法修改的 clob 列,但我需要在使用 spool 创建一些客户端日志文件之前进行处理,因为我无法使用 utl_file 或类似函数来创建它们。如果可能的话,这也应该在 PL/SQL 或 SQL*Plus 中处理,所以我不是在寻找使用文本编辑器、sh/bat 脚本或类似方法从外部消除额外 CR 的解决方案。

我已尝试找出插入它的原因或如何摆脱它,但无济于事,因此将不胜感激。

【问题讨论】:

    标签: plsql oracle11g sqlplus


    【解决方案1】:

    SET LINESIZE 包含到您的 SET 命令中,例如

    set serveroutput on
    set linesize 2000        --> this
    spool ..
    

    【讨论】:

    • 与设置 linesize 的结果相同。
    • 以类似的方式,我也尝试检查并增加服务器输出限制和dbms_output缓冲区限制,但问题仍然存在。
    • 尝试更多 SET:set sqlbl offset pages 0
    • 我尝试了您建议的那些和其他常用的 SQL加上 clob 和格式集,如 COLSEP、LONGC、WRA 或 SERVEROUTPUT 的不同选项。该问题似乎不是来自 SQPPlus 和 spool 集,因为从 select 子句直接输出时会正确显示换行符,但它似乎与 dbms_output 处理 CR 字符的方式有关它的 put 方法或返回时隐式调用的 get。
    【解决方案2】:

    使用 DBMS_OUTPUT.PUT。
    此过程将部分行放入缓冲区中。

    关于“数据库 PL/SQL 包和类型参考”,第 100 章 DBMS_OUTPUT
    PUT Procedure

    【讨论】:

    • Aa 在您提供的链接中解释,put_line 与 put 相同,但末尾有一个行终止符。在我的情况下,问题不在于缓冲区终止,而在于内容中的 CR,并且使用 put 的结果与 put_line 相同。
    • 您运行 SQL*Plus 的操作系统是什么?
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2017-11-24
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多