我正在尝试在PL / SQL中做一些非常基本的事情,但我一直在拥有......如何将项目推送到数组中并迭代它们?
谷歌搜索似乎建议使用owa_text.multi_line
;
owa_text.multi_line
是此类型的记录:
/* A multi_line is just an abstract datatype which can hold */
/* large amounts of text data as one piece. */
type multi_line is record
(
rows vc_arr,
num_rows integer,
partial_row boolean
);
要遍历vc_arr
,我们必须使用l_array.first.. l_array.last
。但是在尝试访问它时会出错。
这是一个简单的示例,可以将不同的值加载到数组中:
declare
l_persons owa_text.multi_line := owa_text.new_multi();
/* Documentation of owa_text.new_multi(): Standard "make element" routines. */
--function new_multi return multi_line;
l_value_exists boolean := false;
cursor c_get_orders is
select person,
choice
from my_orders;
begin
for i in c_get_orders loop
l_value_exists := false;
for j in l_persons.rows.first.. l_persons.rows.last loop --Fails here,
--PL/SQL: numeric or value error
if l_persons.rows(j) = i.person then
l_value_exists := true;
exit;
end if;
end loop;
if not l_value_exists then
owa_text.add2multi(i.person, l_persons);
end if;
end loop;
for i in l_persons.rows.first.. l_persons.rows.last loop
write_to_log(l_persons.rows(i));
end loop;
end;
我错过了什么?我该怎么做?
编辑:这是一个设置的脚本,如果它有助于遵循示例:
create table my_orders
(
person varchar2(4000 byte),
choice varchar2(4000 byte)
);
insert into my_orders
(person, choice)
values
('Tom', 'Juice');
insert into my_orders
(person, choice)
values
('Jane', 'Apple');
insert into my_orders
(person, choice)
values
('Tom', 'Cake');
insert into my_orders
(person, choice)
values
('Jane', 'Chocolate');
insert into my_orders
(person, choice)
values
('Tom', 'Coffee');
commit;
答案 0 :(得分:2)
Presumable,new_multi()
方法初始化一个空集合。
Oracle集合的一个更深奥的功能是使用FIRST
/ LAST
迭代空集合不起作用 - 您必须检查集合是否为空,或者使用{ {1}}代替:
1 .. <collection>.COUNT
<强>更新强>
有关迭代PL / SQL集合的技术的更全面说明,请参阅此OTN article by Steven Feuerstein
答案 1 :(得分:1)
必须是这样的:
declare
l_persons owa_text.multi_line;
begin
OWA_TEXT.new_multi (l_persons);
FOR i IN 1 .. l_persons.num_rows
loop
null;
end loop;
end;