4

有没有人注意到这种dbms_output.put_line无法一次打印超过 2000 个字符的现象?

脚本是:

set serveroutput on size 100000;

declare
    big_str varchar2(2009);
begin
    for i in 1..2009 loop
        big_str := big_str||'x';
    end loop;

    dbms_output.put_line(length(big_str));
    dbms_output.put_line(big_str);
end;

/

我将输出复制并粘贴到编辑器(Notepad++)中,它告诉我只有 2000 个字符,而不是我认为应该粘贴的 2009。这也发生在我的一些测试脚本中——只打印了 2000 个字符。

我有一个解决方法可以像这样打印:

dbms_output.put_line(length(big_str));
dbms_output.put_line(substr(big_str,1,1999));
dbms_output.put_line(substr(big_str,2000));

这会在输出中添加新行,当您正在使用的文本被预先格式化时,很难阅读。

有没有其他人注意到这一点?它真的是一个错误或某种晦涩的功能吗?有更好的解决方法吗?还有其他关于这方面的信息吗?

Oracle 版本是:10.2.0.3.0,使用 PL/SQL Developer(来自 Allround Automation)。

4

6 回答 6

11

这不是对 Oracle 或 put_line 的限制,而是对您的 IDE 的限制。

来自 Oracle 文档:http: //download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_output.htm#ARPLS036

规则和限制

  • 最大行大小为 32767 字节。
  • 默认缓冲区大小为 20000 字节。最小大小为 2000 字节,最大无限制。

您可以使用 SQL*Plus 对此进行测试。

您看到 2000 的事实使我相信您的 IDE 中有一个设置将其设置为最小值。

于 2009-11-20T14:11:54.530 回答
1

我不知道有什么比这样拆分更好的解决方法。为了避免换行,除了最后一个电话以外,每次都拨打电话,dbms_output.put而不是dbms_output.put_line

于 2009-11-19T22:26:10.710 回答
1

根据TFM,最大行大小应为 32767。我建议您使用 DBMS_OUTPUT.GET_LINE 来读取长行;如果被截断,这是 DBMS_OUTPUT 中的错误。如果不是,这是 PL/SQL Developer 中的一个错误。

于 2009-11-20T11:45:10.180 回答
-2

做 dbms_output.enable(1000000);

然后尝试...

于 2009-11-19T22:44:12.093 回答
-2

您的问题听起来与您正在执行脚本的 Oracle 数据库的字符编码方案有关。

Oracle 支持单字节字符编码方案,即(1 byte) = (1 character)和多字节字符编码方案,即(x bytes) = (1 character)

VARCHAR2 数据类型语义默认为 BYTES,这意味着如果数据库的默认值未更改,则 VARCHAR2(2009) 表示此数据类型包含 2009 BYTES。

Oracle 中的 VARCHAR2 的最大限制为4000 字节,这当然意味着如果您的数据库使用单字节字符编码方案,则 4000 字节 = 4000 个字符。由于您的代码仅产生 2000 个字符,因此您的数据库使用双字节字符编码方案可能是一个安全的假设。

您可以在http://download-uk.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i1835阅读更多相关信息。此链接适用于 Oracle 11.1 数据库,但我认为数据类型没有太大变化。

我希望这些信息对您有所帮助。

于 2009-11-20T01:13:50.670 回答
-3

尝试在 SqlPlus 中设置 linesize。

set linesize 4000

您可能还希望将页面大小设置为较低的值。

于 2009-11-20T11:32:43.643 回答