检查Oracle中是否存在集合元素
我创建了一个简单类型:检查Oracle中是否存在集合元素,oracle,stored-procedures,exists,user-defined-types,Oracle,Stored Procedures,Exists,User Defined Types,我创建了一个简单类型: create or replace TYPE SIMPLE_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20)); 简单测试: DECLARE TYPE ObjectList IS TABLE OF SIMPLE_TYPE; tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a'); o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'),
create or replace TYPE SIMPLE_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));
简单测试:
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;
我得到一个例外:PLS-00302:必须声明组件“存在”
但这个例子是有效的:
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;
是否可以在简单的_类型中实现EXISTS方法
tmp SIMPLE_TYPEE := SIMPLE_TYPE(1, 'a');
…
IF tmp.EXISTS(tmp) THEN
您将tmp
声明为SIMPLE\u TYPE
,而不是ObjectList
SIMPLE\u TYPE
是标量类型,而不是集合
您可能想改为选中o.EXISTS
(这是一个对象列表
)
更新:
存在
应用于集合时,将整数索引作为参数,并检查具有此索引的元素是否存在(而不是其值)
要检查表中是否存在SIMPLE_TYPE(1,'a')
,您应该执行以下操作:
在字典中创建ObjectList
:
CREATE TYPE ObjectList IS TABLE OF SIMPLE_TYPE;
发出SELECT
查询:
DECLARE
tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a');
o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'), SIMPLE_TYPE(3, 'a'));
myid INT;
BEGIN
SELECT 1
INTO myid
FROM TABLE(o) q
WHERE SIMPLE_TYPE(q.id, q.name) = tmp
AND rownum = 1;
IF (myid = 1) THEN
dbms_output.put_line('OK, exists.');
END IF;
END;
由于,存在(
)测试集合中是否存在编号的条目。也就是说,array.exists(3)
断言已填充array
的第三个元素
在第一个示例中,您试图做的是测试实例tmp
是否与ObjectList
中的元素匹配。从10g开始,我们可以使用语法的成员来执行此操作。不幸的是,为了实现这一点,我们必须声明一个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>
运行示例
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>
是否确实要tmp.EXISTS
,而不是o.EXISTS
tmp
是标量,即使您更正了它的类型。这不是一个集合。此外,我们必须提供“未发现数据”异常。谢谢你的提示<代码>成员
。。这是一个改变我生活的暗示!令人惊叹的!谢谢