2013-06-07 4 views
0

Мне нужно найти, существует ли определенный элемент внутри коллекции. Я знаю о функции EXISTS, но возвращает только true, если определенный индекс занят, а не если элемент находится внутри этой коллекции.Выбор/поиск из коллекции

У меня есть следующий вид:

CREATE OR REPLACE TYPE Person AS OBJECT (
    ID NUMBER(12, 0), 
    FIRST_NAME VARCHAR2(100), 
    LAST_NAME VARCHAR2(100) 
); 

CREATE OR REPLACE PACKAGE MY_TYPES AS 
    TYPE PersonTable IS TABLE OF Person; 
END MYTYPES; 

тогда я попробовать следующее:

DECLARE 
    v_Row PERSON := PERSON(NULL, NULL, NULL); 
    v_Table MYTYPES.PersonTable := MYTYPES.PersonTable(); 
BEGIN 
    SELECT ID, FIRST_NAME, LAST_NAME INTO v_Row FROM TABLE(v_Table); 
END; 

но получает следующее сообщение об ошибке:

ORA-06550 
PLS-00642: local collection types not allowed in SQL Statements. 

Я также попытался:

DECLARE 
    v_Row PERSON := PERSON(NULL, NULL, NULL); 
    v_Table MYTYPES.PersonTable := MYTYPES.PersonTable(); 
BEGIN 
    SELECT ID, FIRST_NAME, LAST_NAME INTO v_Row FROM TABLE(CAST(v_Table AS MYTYPES.PersonTable)); 
END; 

, но и получает ошибку:

ORA-00902: invalid datatype 

Спасибо.

ответ

0

Поскольку select утверждение принадлежит SQL, не PL/SQL, вам нужно объявить PersonTable типа на уровне базы данных, как Person типа:

CREATE OR REPLACE TYPE Person AS OBJECT (
    ID NUMBER(12, 0), 
    FIRST_NAME VARCHAR2(100), 
    LAST_NAME VARCHAR2(100) 
); 

/

create or replace TYPE PersonTable IS TABLE OF Person; 
/

Затем вы можете использовать его по своему желанию:

DECLARE 
    v_Row PERSON; 
    v_Table PersonTable; 
BEGIN 

    select Person(1 , 'a' , 'b') 
    bulk collect into v_Table 
    from dual; 


    SELECT Person(ID, FIRST_NAME, LAST_NAME) INTO v_Row 
    FROM TABLE(v_Table); 

END; 

Иллюстрируется SQLFiddle.

+0

Это работает, спасибо. – randacun