oracle pl/sql 错误:不能 put_line 超过 2000 个字符

Posted

技术标签:

【中文标题】oracle pl/sql 错误:不能 put_line 超过 2000 个字符【英文标题】:oracle pl/sql bug: can't put_line more than 2000 characters 【发布时间】:2009-11-19 22:22:15 【问题描述】:

有没有其他人注意到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)。

【问题讨论】:

从未尝试过 - 这是 QA 的大量输出。这是动态 SQL 的吗? 是什么让您认为这是一个错误?也许 put_line 被设计限制为 2000 个字符。 @Skaffman:我在 put_line 文档中没有看到任何说明将打印不超过 2000 个字符的内容。此外,如果有 2000 个字符的硬限制并且我超过了它,我希望会抛出一个错误,而不是让 2000 之后的所有字符都被静默删除。 @OMG Ponies:当我注意到正在打印的数据与加载的数据不匹配时,我发现了这一点。我知道这张表中有一些记录会很长,我正在调查以找出有多少,并获取其中少数记录的详细信息。 【参考方案1】:

这不是对 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 中有一个设置将其设置为最小值。

【讨论】:

是的,它是 IDE!我在 SQL*Plus 中运行了相同的脚本,打印了 2009 个字符。【参考方案2】:

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

【讨论】:

我只是尝试先使用 put,然后再使用 put_line:仍然只打印 2000 个字符! 我知道。我告诉你如何避免烦人的换行符,而不是如何避免多次调用 dbms_output :)【参考方案3】:

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

【讨论】:

【参考方案4】:

执行 dbms_output.enable(1000000);

那就试试吧……

【讨论】:

我相信和set serveroutput on size 1000000;的效果是一样的,但我还是试了一下,没有变化。 这会改变可能的行数。【参考方案5】:

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

Oracle 支持单字节字符编码方案,即 (1 字节) = (1 个字符),以及多字节字符编码方案,即 (x 字节) = (1 个字符) .

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

Oracle 中的

VARCHAR2 的 ma​​x 限制为 4000 字节,这当然意味着如果您的数据库使用单字节字符编码方案,则 4000 字节 = 4000 个字符。由于您的代码仅生成 2000 个字符,因此可以安全地假设您的数据库使用的是双字节字符编码方案。

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

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

【讨论】:

我想补充一点,varchar2 数据类型的最大大小取决于它的声明位置。例如,在 PL/SQL 中,最大大小为 32767 字节。参考:download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/… -1,因为 varchar2 变量(不是表列)可以长于 4K,即 32K 感谢 carpenteri 和 ammoQ 指出这一点。我严重误解了这个问题的背景。我向所有浪费时间阅读我的答案的人表示歉意。【参考方案6】:

尝试在 SqlPlus 中设置 linesize。

set linesize 4000

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

【讨论】:

以上是关于oracle pl/sql 错误:不能 put_line 超过 2000 个字符的主要内容,如果未能解决你的问题,请参考以下文章

oracle pl/sql 错误:不能 put_line 超过 2000 个字符

ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束

PL/SQL - XML 验证错误

Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置

PL/SQL登陆就会提示TNS协议适配器错误,这啥问题。

Oracle PL/SQL 不能识别 DATE 输入?