2

生成されたXMLを印刷できるようにするには、varchar2(2000)よりもはるかに大きなものが必要です。dbms_output.put_line(x)よりも優れたアプローチを推奨するか、結果を格納してから出力するために別のデータ型を推奨します。私はOracleの初心者であり、フルタイムの仕事はUI開発です。

declare
    v_ctx dbms_xmlgen.ctxHandle;
    x varchar2(2000); -- I need something bigger than varchar2(2000)
begin
    v_ctx := DBMS_XMLGen.newContext('
        select
            baz as "Baz"
        from schema.table_with_10000_rows');
    DBMS_XMLGen.setRowsetTag(v_ctx, 'Foo');
    DBMS_XMLGen.setRowTag(v_ctx, 'Bar');
    x := dbms_xmlgen.getxml(v_ctx);
    dbms_output.put_line(x);
end;
4

1 に答える 1

2

CLOB4000 文字を超える場合はa を使用する必要があり、それがgetxml返されるデータ型です。この質問は同じ問題に近づいているようで、ループしてチャンクで出力する簡単な方法を示していますが、それには欠陥があります-dbms_output.put()代わりに使用する必要がありますput_line(編集:dbms_output.new_lineループの後に端末を使用する可能性があります;テストされていません恐れ)。

SQL*Plus でこれを行っている場合は、クライアント バインド変数dbms_outputの使用を完全に避けることができます。

var x clob;

declare
    v_ctx dbms_xmlgen.ctxHandle;
begin
    v_ctx := DBMS_XMLGen.newContext('
        select table_name as "Baz"
        from all_tables');
    DBMS_XMLGen.setRowsetTag(v_ctx, 'Foo');
    DBMS_XMLGen.setRowTag(v_ctx, 'Bar');
    :x := dbms_xmlgen.getxml(v_ctx);
end;
/

print x

xPL/SQLブロックの外側で宣言され、バインド変数として使用されます。代入内のコロンに注意してください:x := ....

X
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<Foo>
 <Bar>
  <Baz>DUAL</Baz>
 </Bar>
 <Bar>
  <Baz>SYSTE

デフォルトでは、おそらく XML の先頭のみが表示されます。すべてを表示する必要がありset long <some big number>、(11g の時点で) 2GB に制限されています。(フィードバックと見出しをオフに設定したり、おそらく longchunk を設定したりすることもあると思います)。


テーブルに保存するのではなく、なぜこのように画面に出力するのか疑問に思います。最終的な目標がファイルに入れることである場合は、utl_fileより適切かもしれません。このようなものかもしれません。

于 2012-10-05T07:23:37.870 に答える