您可以在 PL/SQL 中完成所有操作,无需上下文切换到 SQL 范围:
DECLARE
-- Initialise the collection
v_OBJECT_TYPE_REL_IDS T_OBJECT_TYPE_REL_IDS := T_OBJECT_TYPE_REL_IDS();
BEGIN
-- Extend the collection by the default amount (1 element)
v_OBJECT_TYPE_REL_IDS.EXTEND;
-- Set the first element to be your student type
v_OBJECT_TYPE_REL_IDS(1) := GT_OBJECT_TYPE_REL_IDS (10, 'STUDENT');
-- Extend the collection by 1 element
v_OBJECT_TYPE_REL_IDS.EXTEND(1);
-- Set the last element to be your college type
v_OBJECT_TYPE_REL_IDS(v_OBJECT_TYPE_REL_IDS.COUNT) := GT_OBJECT_TYPE_REL_IDS (11, 'COLLEGE');
OPEN :curs FOR SELECT * FROM TABLE (v_OBJECT_TYPE_REL_IDS);
END;
/
你也可以在构造函数中这样做:
DECLARE
-- Initialise the collection
v_OBJECT_TYPE_REL_IDS T_OBJECT_TYPE_REL_IDS := T_OBJECT_TYPE_REL_IDS(
GT_OBJECT_TYPE_REL_IDS (10, 'STUDENT'),
GT_OBJECT_TYPE_REL_IDS (11, 'COLLEGE')
);
BEGIN
OPEN :curs FOR SELECT * FROM TABLE (v_OBJECT_TYPE_REL_IDS);
END;
/
或者,如果您想使用 SQL,那么如果您直接使用 UNION ALL 填充游标的行,则不需要集合类型:
BEGIN
OPEN :curs FOR
SELECT GT_OBJECT_TYPE_REL_IDS (10, 'STUDENT') FROM DUAL UNION ALL
SELECT GT_OBJECT_TYPE_REL_IDS (11, 'COLLEGE') FROM DUAL;
END;
/
或者,使用集合:
BEGIN
OPEN :curs FOR
SELECT *
FROM TABLE(
T_OBJECT_TYPE_REL_IDS(
GT_OBJECT_TYPE_REL_IDS (10, 'STUDENT'),
GT_OBJECT_TYPE_REL_IDS (11, 'COLLEGE')
)
);
END;
/
那么,使用前两个版本中的任何一个,您都可以完全避免使用游标和 PL/SQL。即:
SELECT *
FROM TABLE(
T_OBJECT_TYPE_REL_IDS(
GT_OBJECT_TYPE_REL_IDS (10, 'STUDENT'),
GT_OBJECT_TYPE_REL_IDS (11, 'COLLEGE')
)
);
或者,merge two collections:
DECLARE
v_OBJECT_TYPE_REL_IDS T_OBJECT_TYPE_REL_IDS;
BEGIN
--Explicit Constructor
v_OBJECT_TYPE_REL_IDS := T_OBJECT_TYPE_REL_IDS( GT_OBJECT_TYPE_REL_IDS (10, 'STUDENT') );
-- Merge in SQL using MUTLISET UNION ALL
SELECT v_OBJECT_TYPE_REL_IDS
MULTISET UNION ALL
T_OBJECT_TYPE_REL_IDS( GT_OBJECT_TYPE_REL_IDS (11, 'COLLEGE') )
INTO v_OBJECT_TYPE_REL_IDS
FROM DUAL;
OPEN :curs FOR SELECT * FROM TABLE (v_OBJECT_TYPE_REL_IDS);
END;
/