Plsql PL/SQL dbms_输出在CLOB中添加额外的回车符

Plsql PL/SQL dbms_输出在CLOB中添加额外的回车符,plsql,oracle11g,sqlplus,Plsql,Oracle11g,Sqlplus,当使用dbms_输出放置带有回车符的clob时,它会插入一个附加的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.tx

当使用dbms_输出放置带有回车符的clob时,它会插入一个附加的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_文件或类似函数来创建它们。如果可能的话,这也应该在PL/SQL或SQL*Plus内部处理,因此我不想在外部使用文本编辑器、sh/bat脚本或类似方法来消除额外的CRs


我试图找出插入的原因或如何消除它,但没有任何效果,因此非常感谢您的帮助。

在您的
SET
命令集中包括
设置线条大小
,例如:

set serveroutput on
set linesize 2000        --> this
spool ..
使用DBMS_OUTPUT.PUT.
此过程将在缓冲区中放置部分行

关于“数据库PL/SQL包和类型参考”,第100章DBMS_输出

设置linesize的结果相同。以类似的方式,我也尝试检查并增加serveroutput限制和dbms_输出缓冲区限制,但问题仍然存在。请尝试更多设置:
设置sqlbl off
设置页面0
。我尝试了您建议的设置以及其他常见的SQLPlus clob和格式集,如COLSEP、LONGC、,WRA或服务器输出的不同选项。问题似乎不是来自SQPPlus和spool集合,因为直接从select子句输出时,换行符会正确显示,但这似乎与dbms_output在其put方法或get中处理CR字符的方式有关,后者在返回时被隐式调用。Aa在您提供的链接中解释,put_line与put相同,但在末尾有一个line termintaion。在我的例子中,问题不在于缓冲区终止,而在于内容中的CRs,并且使用put与put_line的结果相同。您运行的是什么操作系统SQL*Plus?