如何正确使用Oracle PL/SQL中TYPE IS REF CURSOR RETURN ref_cursor_type语法?
解决PL/SQL强类型REF CURSOR声明报错(PLS-00362)的问题
你遇到的核心问题是误解了文档中ref_cursor_type的含义:它并非指已定义的REF CURSOR类型本身,而是指该REF CURSOR对应的返回记录类型。PL/SQL要求强类型REF CURSOR的RETURN子句必须指定记录类型(或表/视图的行类型),不能直接引用另一个REF CURSOR类型,这也是触发PLS-00362错误的原因。
正确用法示例
方式1:复用已有强类型REF CURSOR的返回类型
通过%ROWTYPE获取原REF CURSOR对应的记录类型,以此声明新的强类型REF CURSOR:
CREATE OR REPLACE PACKAGE myPkg AS -- 声明第一个强类型REF CURSOR,返回sys.all_arguments的行类型 TYPE t_UDTRefCursor IS REF CURSOR RETURN sys.all_arguments%ROWTYPE; -- 正确复用原REF CURSOR的返回记录类型 TYPE t_MyCursorType IS REF CURSOR RETURN t_UDTRefCursor%ROWTYPE; END; /
方式2:基于共享记录类型声明多个REF CURSOR
先定义通用的记录类型,再基于该类型声明多个强类型REF CURSOR,这也是文档中ref_cursor_type的典型应用场景:
CREATE OR REPLACE PACKAGE myPkg AS -- 定义共享的记录类型 TYPE t_ArgRecord IS RECORD ( owner sys.all_arguments.owner%TYPE, object_name sys.all_arguments.object_name%TYPE, argument_name sys.all_arguments.argument_name%TYPE ); -- 基于记录类型声明第一个REF CURSOR TYPE t_UDTRefCursor IS REF CURSOR RETURN t_ArgRecord; -- 直接引用共享记录类型声明第二个REF CURSOR TYPE t_MyCursorType IS REF CURSOR RETURN t_ArgRecord; END; /
错误原因说明
你之前的代码中TYPE t_MyCursorType IS REF CURSOR RETURN t_UDTRefCursor;试图让REF CURSOR返回另一个REF CURSOR类型,这违反了PL/SQL的语法规则:强类型REF CURSOR的返回类型只能是记录类型、表行类型、视图行类型、对象类型或%ROWTYPE/%TYPE衍生的类型,不能是REF CURSOR类型本身。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

