Det är väldigt enkelt om du använder PL/SQL som SQL och inte som andra språk. Det är ganska specifikt och ibland väldigt trevligt just därför.
Ibland hatar jag verkligen PL/SQL, men det här fallet handlar absolut om kärlek.
Se hur enkelt det är:
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;
Här kan du se problemet med att du måste skapa globala typer, och det är detta jag hatar det för. Men de säger att i Oracle 12 kan det göras med lokalt definierade typer så jag väntar på det :)
Utdata är:
Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin
REDIGERA
Så vitt du inte vet antalet iterationer från början är det enda sättet att göra förlängning på varje iteration (detta är bara ett exempel på förlängning):
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;
Jag föredrar det andra sättet eftersom det är snabbare (beräknar inte .last
). på varje iteration).