You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:13:21