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

谢谢。

4

1 回答 1

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说明。

于 2013-06-07T07:23:23.610 回答