5

Oracle Database 11g Enterprise Edition リリース 11.2.0.2.0 - 64 ビット製品。

以下の形式の表があります。

Name     Department
Johny    Dep1
Jacky    Dep2
Ramu     Dep1

以下の形式の出力が必要です。

Dep1 - Johny,Ramu
Dep2 - Jacky

「LISTAGG」機能を試してみましたが、4000 文字という厳しい制限があります。私のdbテーブルは巨大なので、これはアプリでは使用できません。他のオプションは、

SELECT CAST(COLLECT(Name)

しかし、私のフレームワークでは、選択クエリのみを実行でき、PL/SQL スクリプトは実行できません。したがって、COLLECT コマンドに必要な「CREATE TYPE」コマンドを使用して型を作成する方法が見つかりません。

select query を使用して上記の結果を達成する別の方法はありますか?

4

5 に答える 5

8

GetClobVal を追加する必要があり、結果の最後に区切り文字が返されるため、rtrim も必要です。

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') 
  ORDER BY colname).GetClobVal(),',') from tablename;
于 2015-03-13T10:58:56.427 に答える
6

型を作成できない (sql*plus を使用して 1 回限りで作成することはできませんか?) が、COLLECT で問題ない場合は、組み込みの配列を使用します。RDBMS にはいくつかの機能があります。次のクエリを実行します。

select owner, type_name, coll_type, elem_type_name, upper_bound, length 
 from all_coll_types
 where elem_type_name = 'VARCHAR2';

たとえば、私のデータベースでsys.DBMSOUTPUT_LINESARRAYは、かなりのサイズの varray を使用できます。

select department, 
       cast(collect(name) as sys.DBMSOUTPUT_LINESARRAY) 
  from emp 
 group by department;
于 2013-03-28T11:25:08.703 に答える
5

@anuu_online の派生ですが、結果の XML のエスケープ解除を処理します。

dbms_xmlgen.convert(xmlagg(xmlelement(E, name||',')).extract('//text()').getclobval(),1)
于 2014-04-15T19:17:21.530 に答える
3

4000 のハード リミットを持たない XMLAGG 関数を使用する別のアプローチになります。

select department,
XMLAGG(XMLELEMENT(E,name||',')).EXTRACT('//text()')  
from emp 
group by department;
于 2013-03-28T19:20:50.033 に答える