如果我在Oracle中有这样的集合:
DECLARE
TYPE v_type IS TABLE OF varchar2(4000);
v_coll v_type := v_type();
v_num_dups NUMBER;
BEGIN
v_coll.extend();
v_coll(1):= 'not dupe';
v_coll.extend();
v_coll(2):= 'dupe';
v_coll.extend();
v_coll(3):= 'dupe';
for i in 1..v_coll.count loop
dbms_output.put_line(v_coll(i));
end loop;
END;
如何在不循环收集和计算的情况下将dupe
次出现的次数返回v_num_dups
?
是否有一些简单的方式来说v_coll.count('dupe')
或类似的东西?
答案 0 :(得分:1)
如果您想完全避免重复,可以使用关联数组。类似的东西:
DECLARE
TYPE v_type IS TABLE OF number index by varchar2(4000);
v_coll v_type;
idx varchar2(4000);
BEGIN
v_coll('not dupe'):= 1;
v_coll('dupe'):= 1;
v_coll('dupe'):= 1;
-- show key values
idx := v_coll.first;
loop
exit when idx is null;
dbms_output.put_line(idx);
idx := v_coll.next(idx);
end loop;
END;
输出:
dupe
not dupe
答案 1 :(得分:0)
不幸的是,没有(至少11g)。 您必须手动迭代集合并执行计数。
答案 2 :(得分:0)
虽然我喜欢tbone
的答案,但这也非常适合删除重复项:
DECLARE
TYPE v_type IS TABLE OF varchar2(4000);
v_coll v_type := v_type();
v_num_dups NUMBER;
BEGIN
v_coll.extend();
v_coll(1):= 'not dupe';
v_coll.extend();
v_coll(2):= 'dupe';
v_coll.extend();
v_coll(3):= 'dupe';
v_coll:=SET(v_coll); --<----remove dups!
dbms_output.put_line(cardinality(v_coll));
for i in 1..v_coll.count loop
dbms_output.put_line(v_coll(i));
end loop;
END;