Oracle 从集合中选择/搜索

Oracle 从集合中选择/搜索,oracle,oracle10g,Oracle,Oracle10g,我需要搜索集合中是否存在某个项目。我知道EXISTS函数,但它仅在某个索引被占用时才返回true,而在某个项位于该集合内时才返回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

我需要搜索集合中是否存在某个项目。我知道EXISTS函数,但它仅在某个索引被占用时才返回true,而在某个项位于该集合内时才返回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

谢谢。

因为
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;
如图所示