4

次のタイプのPL/SQLコレクションがあります

type p_typ_str_tab is table of varchar2(4000) index by pls_integer;

LISTAGGカスタム関数や for ループを記述せずに、単純なインライン関数を使用して値を単一の文字列に集約したいと考えています。すべての例で、LISTAGGPL/SQL コレクションの使用方法が示されているわけではありません。Oracle 11g R2 を使用しています。これは可能ですか?

4

2 に答える 2

9

コレクションで関数を使用できるようにするLISTAGGには、select ステートメントで pl/sql 型を使用できないため、コレクションを連想配列としてではなく、ネストされたテーブルとして宣言し、SQL 型 (スキーマ オブジェクト) として作成する必要があります。そのために、次のことを行うことができます。

--- create a nested table type
SQL> create or replace type t_tb_type is table of number;
  2  /

Type created


--- and use it as follows
SQL> select listagg(column_value, ',') within group(order by column_value) res
  2    from table(t_tb_type(1,2,3)) -- or call the function that returns data of 
  3  /                              -- t_tb_type type

RES
-------
1,2,3

それ以外の場合loopは、唯一の選択肢です。

于 2012-12-20T19:35:24.037 に答える
5

LISTAGGは分析SQL関数であり、これらはPL/SQLコレクションではなく、カーソル/行セットに対して機能します。

要するに、いいえ、それは不可能です。

つまり、連結された文字列を作成するために PL/SQL テーブルを反復処理するのは簡単です。

l_new_string := null;
for i in str_tab.first .. str_tab.last
loop
  if str_tab(i) is not null then
    l_new_string := str_tab(i) || ', ';
  end if;
end loop;
-- trim off the trailing comma and space
l_new_string := substr(l_new_string, 1, length(l_new_string) - 2);
于 2012-12-20T19:29:49.510 に答える