3

SYS_CONNECT_BY_PATHを使用して文字列の集計を行っています。クエリの一般的な形状は次のようになります。

select /*a bunch of fields unrelated to the problem*/,
--Use SYS_CONNECT_BY_PATH to glue together all the chunks of XML. 
--The XSL header and footer are prepended and appended here.
 , XMLType(to_clob('<?xml version="1.0"?><!-- begining of XSL file -->,'<!-- Next Section -->'))||'</xsl:stylesheet>')) AS XSL
from (
  select /*a bunch of fields unrelated to the problem*/
    case when x = 1 then to_clob('
    /*a bunch of XSL*/
     <xsl:text>'||subq.new_c_value||'</xsl:text>
    /*a whole bunch more xsl*/')
    else
     to_clob('/*a bunch of different XSL*/             
     <xsl:text>'||subq.new_f_value||'</xsl:text>
    /*a whole bunch more xsl*/')
    end as xsl,
  --curr and prev are to help with using sys_connect_by_path do string aggregation.
    rownum AS curr,
    rownum -1 AS prev
  from (Select /* details of subq not relevant */ ) as subq
)
CONNECT BY prev = PRIOR curr 
START WITH curr = 1;

基本的に、XMLファイルの修正に使用されるXSLを生成するクエリを実行しています。sys_connect_by_pathを使用して、文字列を1つのチャンクに結合しています。これは、多くの行から多くの値をコピーして貼り付けるよりも簡単です。このクエリは本番データベースで実行されるため、カスタム文字列集計関数を使用できません。本番データベースでは、必要に応じて関数を作成することができません。

問題は、クエリを実行すると次のように返されることです。

ORA-01489:文字列連結の結果が長すぎます
01489.00000-「文字列連結の結果が長すぎます」
*原因:文字列連結の結果が最大サイズを超えています。
*アクション:結果が最大サイズよりも小さいことを確認してください。

...データが多すぎる場合。ご覧のとおり、私はこのto_clob()関数を役立つと思うところならどこにでも適用してきましたが、それほど大きな違いはないようです。PL / SQLに頼る以外に、これを処理する他の方法はありますか?このクエリの結果は、XSLと並べていくつかの有用な情報を表示するレポートテンプレートにエクスポートされるため、これをクエリとして保持することをお勧めします。これらすべてを、複数のステップではなく、1つのステップで実行できると便利です。

(Oracle 10g)


最終的に、私はこのページを見つけました:

http://www.sqlsnippets.com/en/topic-11787.html

Oracleの文字列集約手法について。私の状況で機能するのは、XMLメソッドとModelメソッドだけだと思います。モデルメソッドを正しく機能させることができなかったので、XMLメソッドを使用しました。

4

2 に答える 2

1
select
    xmlroot
    (
        xmlelement
        (
            "xsl:stylesheet"
            ,XMLAttributes
            (
                '1.0' as version
                ,'http://www.w3.org/1999/XSL/Transform' as "xmlns:xsl"
                ,'http://test' as "xmlns:ns0"
            )
            ,(
                xmlagg(xmlelement("xsl:text", val))
            )
        )
        ,version '1.0'
    )
from
(
    --Test >4000 characters
    select 1 id, cast(rpad('a',4000,'a') as varchar2(4000)) val from dual union all
    select 1 id, cast(rpad('b',4000,'b') as varchar2(4000)) val from dual union all
    select 1 id, cast(rpad('c',4000,'c') as varchar2(4000)) val from dual union all
    select 1 id, cast(rpad('d',4000,'d') as varchar2(4000)) val from dual
);
于 2012-05-04T04:50:07.940 に答える
0

申し訳ありませんが、私の答えは文字列集約パッケージの作成に依存していますが、長期的には役立つ可能性があります。以下のリンクのAskTomに記載されているsys_connect_by_pathの代わりにStraggパッケージを使用できます

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2196162600402

そのパッケージには、必要に応じてCLOBを処理するために変更できるlongを処理するための宣言といくつかのロジックがあります。

于 2012-05-03T11:13:16.193 に答える