Het is heel gemakkelijk als je PL/SQL als SQL gebruikt en niet zoals andere talen. Het is vrij specifiek en soms juist daarom erg leuk.
Soms heb ik echt een hekel aan PL/SQL, maar deze zaak gaat absoluut over liefde.
Zie hoe gemakkelijk het is:
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;
Hier zie je het probleem dat je globale typen moet maken, en dit is waar ik een hekel aan heb. Maar ze zeggen dat het in Oracle 12 kan worden gedaan met lokaal gedefinieerde typen, dus ik wacht erop :)
De uitvoer is:
Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin
BEWERKEN
Voor zover je het aantal iteraties vanaf het begin niet weet, is de enige manier om elke iteratie uit te breiden (dit is slechts een voorbeeld van verlengen):
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;
Ik geef de voorkeur aan de tweede manier omdat deze sneller is (berekent niet .last
bij elke iteratie).