2009-08-28 90 views
3

存在一個集合元素我創建了一個簡單類型:檢查是否在甲骨文

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; 

是否可以在SIMPLE_TYPE類型中實現EXISTS方法?

+0

您確定要'tmp.EXISTS',不'o.EXISTS'?即使在更正其類型後,「tmp」也是標量。這不是一個集合。 – Quassnoi 2009-08-28 16:49:01

回答

3
tmp SIMPLE_TYPEE := SIMPLE_TYPE(1, 'a'); 

… 

IF tmp.EXISTS(tmp) THEN 

您聲明tmpSIMPLE_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; 
+0

另外我們必須提供NO_DATA_FOUND異常。感謝提示! – 2009-08-31 09:38:02

7

由於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> 
+0

非常好的例子,謝謝! – 2009-08-31 09:37:01

+0

'會員的'..這是一個提示改變了我的生活!真棒!謝謝 ! – WBAR 2013-02-19 13:48:49