我有一个记录表索引。我可以使用函数成员检查PLSQL表中是否存在特定记录。
DECLARE
TYPE emp_name_rec is RECORD(
firstname varchar2(10),
lastname varchar2(10),
hiredate varchar2(10));
TYPE staff IS TABLE OF emp_name_rec;
members staff := staff();
rec emp_name_rec;
rec1 emp_name_rec;
BEGIN
rec.firstname := 'peter';
rec.lastname := 'dunn';
rec.hiredate := 'x';
rec1.firstname := 'mary';
rec1.lastname := 'dunn';
rec1.hiredate := 'y';
members.extend;
members(members.last) := rec;
members.extend;
members(members.last) := rec1;
if rec member of members then
dbms_output.put_line('Yes its there');
else
dbms_output.put_line('no its not');
end if;
END;
这对我不起作用,除了断线连接外我没有错误...看起来好像是编译但是它会导致我的会话崩溃。
答案 0 :(得分:0)
我在Oracle 11g
中尝试使用代码时断开连接。 => 它不起作用!按原样
来自http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm,
您可以检查集合是否为空。不允许比较大于,小于等等。此限制也适用于隐式比较。 [...]
解决方案是:编写代码:
[..]你必须定义你自己的概念集合的意义大于,小于等等,并编写一个或多个函数来检查集合及其集合元素并返回真值或假值。
因此,您不能直接使用MEMBER OF
,而是定义自己的cmp_rec
函数(这在那里非常明显,但似乎不适用于Oracle):
DECLARE
TYPE emp_name_rec is RECORD(
firstname varchar2(10),
lastname varchar2(10),
hiredate varchar2(10));
TYPE staff IS TABLE OF emp_name_rec;
members staff := staff();
rec emp_name_rec;
rec1 emp_name_rec;
rec_is_found boolean :=false;
function cmp_rec ( a emp_name_rec, b emp_name_rec)
return boolean is
begin
return a.firstname=b.firstname and a.firstname=b.firstname and a.hiredate=b.hiredate;
end cmp_rec;
BEGIN
rec.firstname := 'peter';
rec.lastname := 'dunn';
rec.hiredate := 'x';
rec1.firstname := 'mary';
rec1.lastname := 'dunn';
rec1.hiredate := 'y';
members.extend;
members(members.last) := rec;
members.extend;
members(members.last) := rec1;
-- we must loop over the collection ourselves
-- - I choosed to look it all, but we could break the loop when found
for i in 1..members.count loop
dbms_output.put_line(members(i).firstname);
if cmp_rec(members(i), rec) then
rec_is_found:=true;
end if;
end loop;
-- if rec member of members then
-- becomes
if rec_is_found then
dbms_output.put_line('Yes its there');
else
dbms_output.put_line('no its not');
end if;
END;