功能成员是否在oracle中使用记录集合?

时间:2016-04-25 13:02:57

标签: collections plsql oracle11g

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

这对我不起作用,除了断线连接外我没有错误...看起来好像是编译但是它会导致我的会话崩溃。

1 个答案:

答案 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;