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