Collections 函数的成员是否处理oracle中的记录集合?

Collections 函数的成员是否处理oracle中的记录集合?,collections,plsql,oracle11g,Collections,Plsql,Oracle11g,我有一个记录表索引。我可以使用函数的成员检查by 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_re

我有一个记录表索引。我可以使用函数的成员检查by 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;

这对我不起作用,我没有收到任何错误,除非我断开连接。。。它看起来可以编译,但会使我的会话崩溃。

在Oracle 11g中尝试您的代码时,我断开了连接它不工作!照原样

您可以检查集合是否为空。不允许进行大于、小于等比较。此限制也适用于隐式比较。[……]

解决方案是:编写代码:

[…]您必须定义自己对集合大于、小于等的定义,并编写一个或多个函数来检查集合及其元素并返回真值或假值

因此,您不能直接使用的
成员,而是定义您自己的
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;