次のタイプのPL/SQLコレクションがあります
type p_typ_str_tab is table of varchar2(4000) index by pls_integer;
LISTAGG
カスタム関数や for ループを記述せずに、単純なインライン関数を使用して値を単一の文字列に集約したいと考えています。すべての例で、LISTAGG
PL/SQL コレクションの使用方法が示されているわけではありません。Oracle 11g R2 を使用しています。これは可能ですか?
次のタイプのPL/SQLコレクションがあります
type p_typ_str_tab is table of varchar2(4000) index by pls_integer;
LISTAGG
カスタム関数や for ループを記述せずに、単純なインライン関数を使用して値を単一の文字列に集約したいと考えています。すべての例で、LISTAGG
PL/SQL コレクションの使用方法が示されているわけではありません。Oracle 11g R2 を使用しています。これは可能ですか?
コレクションで関数を使用できるようにする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
は、唯一の選択肢です。
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);