我创建了一个简单的类型:
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:必须声明组件'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;
是否可以在SIMPLE_TYPE类型中实现EXISTS方法?
答案 0 :(得分:8)
由于documentation states,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>
运行示例......
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>
答案 1 :(得分:3)
tmp SIMPLE_TYPEE := SIMPLE_TYPE(1, 'a');
…
IF tmp.EXISTS(tmp) THEN
您将tmp
声明为SIMPLE_TYPE
,而不是ObjectList
。
SIMPLE_TYPE
是标量类型,而不是集合。
您可能想要检查一下o.EXISTS
(ObjectList
)?
<强>更新强>
应用于集合时, 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;