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;

/

出力をコピーしてエディター (メモ帳++) に貼り付けたところ、2009 文字ではなく、2000 文字しかないことがわかりました。これは、いくつかのテスト スクリプトでも発生します。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

問題は、スクリプトを実行しているOracleデータベースの文字エンコードスキームに関連しているようです。

Oracleは、(1バイト)=(1文字)を意味するシングルバイト文字エンコード方式と、 (xバイト)=(1文字)を意味するマルチバイト文字エンコード方式をサポートしています。

VARCHAR2データ型のセマンティクスはデフォルトでBYTESに設定されています。つまり、データベースでデフォルトが変更されていない場合、VARCHAR2(2009)は、このデータ型が2009BYTESを保持することを意味します。

OracleのVARCHAR2の最大制限は4000バイトです。これは、データベースがシングルバイト文字エンコード方式を使用している場合、4000バイト=4000文字であることを意味します。コードは2000文字しか生成しないため、データベースが2バイト文字エンコード方式を使用していることはおそらく安全な仮定です。

詳細については、http://download-uk.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i1835を参照してください。このリンクはOracle11.1データベース用ですが、データ型に関してはあまり変わっていないと思います。

この情報がお役に立てば幸いです。

于 2009-11-20T01:13:50.670 に答える
-2

dbms_output.enable(1000000); を実行します。

それから試してみてください...

于 2009-11-19T22:44:12.093 に答える
-3

SqlPlusで行サイズを設定してみてください。

set linesize 4000

ページサイズを低い値に設定することもできます。

于 2009-11-20T11:32:43.643 に答える