如果您将 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
EDIT
由于您从一开始就不知道迭代量,唯一的方法是在每次迭代上进行扩展(这只是扩展的示例):
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;
我更喜欢第二种方式,因为它更快(不计算.last
每次迭代)。