Sẽ rất dễ dàng nếu bạn sử dụng PL / SQL như SQL và không giống như các ngôn ngữ khác. Nó khá cụ thể và đôi khi rất hay vì điều đó.
Đôi khi tôi thực sự ghét PL / SQL, nhưng trường hợp này là hoàn toàn về tình yêu.
Xem nó dễ dàng như thế nào:
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;
Ở đây bạn có thể thấy vấn đề là bạn phải tạo các kiểu toàn cục, và đây là điều tôi không thích. Nhưng họ nói trong Oracle 12, nó có thể được thực hiện với các kiểu được xác định cục bộ nên tôi đang đợi nó :)
Đầu ra là:
Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin
CHỈNH SỬA
Theo như bạn không biết số lần lặp lại từ đầu, cách duy nhất là thực hiện kéo dài trên mỗi lần lặp (đây chỉ là ví dụ về việc mở rộng):
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;
Tôi thích cách thứ hai hơn vì nó nhanh hơn (không tính toán .last
trên mỗi lần lặp).