Sangat mudah jika Anda menggunakan PL/SQL sebagai SQL dan tidak seperti bahasa lain. Ini cukup spesifik dan terkadang sangat bagus karena itu.
Terkadang saya sangat membenci PL/SQL, tetapi kasus ini benar-benar tentang cinta.
Lihat betapa mudahnya:
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;
Di sini Anda dapat melihat masalah bahwa Anda harus membuat tipe global, dan inilah yang saya benci. Tetapi mereka mengatakan di Oracle 12 itu bisa dilakukan dengan tipe yang ditentukan secara lokal jadi saya menunggunya :)
Outputnya adalah:
Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin
EDIT
Sejauh Anda tidak tahu jumlah iterasi dari awal, satu-satunya cara adalah melakukan perluasan pada setiap iterasi (ini hanya contoh perluasan):
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;
Saya lebih suka cara kedua karena lebih cepat (tidak menghitung .last
pada setiap iterasi).