从集合中选择/搜索

时间:2013-06-07 06:46:12

标签: oracle oracle10g

我需要搜索集合中是否存在某个项目。我知道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

感谢。

1 个答案:

答案 0 :(得分: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说明。