检查Oracle中是否存在集合元素

Mic*_*ber 3 oracle stored-procedures exists user-defined-types

我创建一个简单的类型:

create or replace TYPE SIMPLE_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));
Run Code Online (Sandbox Code Playgroud)

简单测试:

DECLARE
   TYPE ObjectList IS TABLE OF SIMPLE_TYPE;
   tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a');
   o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'), SIMPLE_TYPE(3, 'a'));
BEGIN
   IF tmp.EXISTS(tmp) THEN
    dbms_output.put_line('OK, exists.');
   END IF;
END;
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:PLS-00302:必须声明组件'EXISTS'

但这个例子工作:

DECLARE
   TYPE NumList IS TABLE OF INTEGER;
   n NumList := NumList(1,3,5,7);
BEGIN
   n.DELETE(2);
   IF n.EXISTS(1) THEN
      dbms_output.put_line('OK, element #1 exists.');
   END IF;
   IF n.EXISTS(3) = FALSE THEN
      dbms_output.put_line('OK, element #2 has been deleted.');
   END IF;
   IF n.EXISTS(99) = FALSE THEN
      dbms_output.put_line('OK, element #99 does not exist at all.');
   END IF;
END;
Run Code Online (Sandbox Code Playgroud)

是否可以在SIMPLE_TYPE类型中实现EXISTS方法?

APC*_*APC 8

正如文档所述,EXISTS()测试集合中是否存在编号的条目.也就是说,array.exists(3)断言array填充了第三个元素.

您在第一个示例中尝试执行的操作是测试实例是否tmp与元素匹配ObjectList.从10g开始,我们可以使用MEMBER OF语法来完成此操作.不幸的是,为了完成这项工作,我们必须声明一个MAP方法,这个方法相当笨拙,如果对象有很多属性,会变得相当烦人.

SQL> create or replace type simple_type as object
  2       ( id number
  3         , name varchar2(30)
  4         , map member function compare return varchar2);
  5  /

Type created.

SQL>
SQL> create or replace type body simple_type as
  2       map member function compare return varchar2
  3       is
  4          return_value integer;
  5       begin
  6          return to_char(id, '0000000')||name;
  7       end compare;
  8  end;
  9  /

Type body created.

SQL>
Run Code Online (Sandbox Code Playgroud)

运行示例......

SQL> set serveroutput on size unlimited
SQL>
SQL> declare
  2      type objectlist is table of simple_type;
  3      tmp simple_type := simple_type(1, 'a');
  4      o objectlist := new objectlist(simple_type(2, 'a'), simple_type(3, 'a'));
  5  begin
  6      if tmp MEMBER OF o then
  7          dbms_output.put_line('ok, exists.');
  8      else
  9          dbms_output.put_line('search me');
 10      end if;
 11  end;
 12  /
search me

PL/SQL procedure successfully completed.

SQL>
Run Code Online (Sandbox Code Playgroud)


Qua*_*noi 3

tmp SIMPLE_TYPEE := SIMPLE_TYPE(1, 'a');\n\n\xe2\x80\xa6\n\nIF tmp.EXISTS(tmp) THEN\n
Run Code Online (Sandbox Code Playgroud)\n\n

您声明tmpSIMPLE_TYPE, 不是ObjectList

\n\n

SIMPLE_TYPE是标量类型,而不是集合。

\n\n

可能你想检查一下o.EXISTS(这是一个ObjectList)?

\n\n

更新:

\n\n

EXISTS当应用于集合时,采用整数索引作为参数,并检查具有该索引的元素是否存在(而不是其值)。

\n\n

检查一下SIMPLE_TYPE(1, 'a')表中是否存在该文件,您应该执行以下操作:

\n\n

创造ObjectList在字典中

\n\n
CREATE TYPE ObjectList IS TABLE OF SIMPLE_TYPE;\n
Run Code Online (Sandbox Code Playgroud)\n\n

发出SELECT查询:

\n\n
DECLARE\n        tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a');\n        o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'), SIMPLE_TYPE(3, 'a'));\n        myid INT;\nBEGIN\n        SELECT  1\n        INTO    myid\n        FROM    TABLE(o) q\n        WHERE   SIMPLE_TYPE(q.id, q.name) = tmp\n                AND rownum = 1;\n        IF (myid = 1) THEN\n                dbms_output.put_line('OK, exists.');\n        END IF;\nEND;\n
Run Code Online (Sandbox Code Playgroud)\n