PL / SQLをSQLとして使用し、他の言語とは異なり、非常に簡単です。それは非常に具体的であり、そのために非常に優れている場合もあります。
PL / SQLが大嫌いなこともありますが、この場合は絶対に愛についてです。
簡単さをご覧ください:
create type it as object (
iter number,
stringval varchar2(100),
intval integer
);
create type t_it as table of it;
declare
t t_it := new t_it();
tmp1 varchar2(32767);
tmp2 varchar2(32767);
begin
t.extend(4);
t(1) := new it(1,'Oslo',40);
t(2) := new it(2,'Berlin',74);
t(3) := new it(3,'Rome',25);
t(4) := new it(4,'Paris',10);
select listagg(stringval,', ') within group (order by stringval),
listagg(stringval,', ') within group (order by intval)
into tmp1, tmp2
from table(t);
dbms_output.put_line(tmp1);
dbms_output.put_line(tmp2);
end;
/
drop type t_it;
drop type it;
ここでは、グローバルタイプを作成する必要があるという問題を確認できます。これは、私が嫌うものです。しかし、Oracle 12では、ローカルで定義された型で実行できると言われているので、私はそれを待っています:)
出力は次のとおりです。
Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin
編集
最初から反復の量がわからない限り、唯一の方法は各反復で拡張を行うことです(これは拡張の例にすぎません):
declare
iterator pls_integer := 1;
begin
/* some type of loop*/ loop
t.extend();
-- one way to assign
t(t.last) := new it(1,'Oslo',40);
-- another way is to use some integer iterator
t(iterator) := new it(1,'Oslo',40);
iterator := iterator + 1;
end loop;
end;
2番目の方法の方が速いので、私は2番目の方法を好みます(.last
を計算しません) 各反復で)。