只需尝试为我指定的ID找回光标。
CREATE OR REPLACE PACKAGE some_package AS TYPE t_cursor IS REF CURSOR; TYPE t_id_table IS TABLE OF NVARCHAR(38) INDEX BY PLS_INTEGER; PROCEDURE someentity_select( p_ids IN t_id_table, p_results OUT t_cursor); END; CREATE OR REPLACE PACKAGE BODY some_package AS PROCEDURE someentity_select( p_ids IN t_guid_table, p_results OUT t_cursor) IS BEGIN OPEN p_results FOR SELECT * FROM someschema.someentity WHERE id IN (SELECT column_value FROM TABLE(p_ids)); - fails here END; END;
注意:someschema.someentity.id是NVARCHAR2(38)
PL / SQL:ORA-00382:表达式的类型错误 PL / SQL:ORA-22905:无法访问非嵌套表项的行
我哪里错了?
答案 0 :(得分:11)
在12.2之前的Oracle版本中,您只能通过CREATE TYPE语句从非关联数组中的数据库中定义的集合类型进行SELECT:
CREATE TYPE t_id_table IS TABLE OF NVARCHAR(38);
CREATE OR REPLACE PACKAGE some_package AS
PROCEDURE someentity_select(
p_ids IN t_guid_table,
p_results OUT SYS_REFCURSOR);
END;
CREATE OR REPLACE PACKAGE BODY some_package AS
PROCEDURE someentity_select(
p_ids IN t_guid_table,
p_results OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_results FOR
SELECT *
FROM someschema.someentity
WHERE id IN (SELECT column_value FROM TABLE(p_ids));
END;
END;
答案 1 :(得分:3)
这是一个索引表,它是一个PL / SQL类型。
您只能在Oracle的SQL引擎中使用SQL类型。或者PL / SQL类型,Oracle可以将其看作SQL类型。
您可以拥有一个类似于数组的简单集合,并将其用作结果。 (没有索引)
type TGuidList is table of NVarchar(38);
但是最好的兼容性和稳定性,你可以将它声明为全局SQL类型并在包中使用它:
创建类型TGuidList是NVarchar(38);
的表编辑:您不需要NVARChar用于GUID,对吗?一个好的'VarChar应该可以做到这一点。