只有当元素不存在时,我如何才能将元素插入到嵌套表格中?
问题描述:
我想拥有一个嵌套的表格,通过从多个游标中逐一添加自定义对象。但我不想在桌上有重复。我怎样才能做到这一点?只有当元素不存在时,我如何才能将元素插入到嵌套表格中?
这是我如何添加元素表:
create type recipient as object (firstname varchar2, lastname varchar2, email varchar2);
declare type recipients_list is table of recipient;
rec recipients_list := recipients_list();
cursor admins is
select firstname, lastname, email
from users
where profile_id = 1;
cursor operators is
select firstname, lastname, email
from users
where operator = 1;
-- an user may be both admin and operator
....
for to_email in admins
loop
rec.extend;
rec(rec.last) := recipient(to_email.firstname, to_email.lastname, to_email.email);
end loop;
for to_email in operators
loop
rec.extend;
rec(rec.last) := recipient(to_email.firstname, to_email.lastname, to_email.email);
end loop;
请注意,这只是一个例子,在这种特殊情况下的选择可以按顺序改为只有一个光标。但在我的应用中,事情是不同的。谢谢!
答
如果您使用的是Oracle 10g或更高版本,有几种简单的方法可以解决此问题。
一个会使用您现有的代码,并在运算符循环中使用the MEMBER OF operator来测试它是否已存在于集合中。
但是,更简单的方法是定义三个集合。使用批量收集来从每个查询中填充两个具有完整记录集合的集合,然后使用第三个集合过滤掉任何重复项。
Soemthing这样的:
declare
type recipients_list is table of recipient;
recs recipients_list := recipients_list();
admins recipients_list := recipients_list();
operators recipients_list := recipients_list();
begin
select firstname, lastname, email
bulk collect into admins
from users
where profile_id = 1;
select firstname, lastname, email
bulk collect into operators
from users
where operator = 1;
recs := admins multiset union distinct operators;
end;
/
“是否有可能有多个工会?”
它一定是可能的。我不知道是否有一个最大值,但是如果有最大值的话。我发现Oracle中的限制倾向于慷慨的一面;如果我们发现自己违背了限制,那么可能有更好的方法来做任何事情。
谢谢APC!是否有可能有多个工会?如果我添加一个新的选择,我可以然后写'recs:=管理multiset联合不同运营商multiset联合独特vips;'例如?谢谢! – radonys