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

如何解决PL/SQL中为索引表打开REF CURSOR时的ORA-22905错误?

解决ORA-22905:无法从非嵌套表项访问行的问题

要对PL/SQL表执行SELECT语句打开游标时,触发了如下错误:

ORA-22905: cannot access rows from a non-nested table item

原始代码

DECLARE
   CURSOR c
   IS
      SELECT *
      from emp
      offset 0 rows fetch first 10 rows only;

   TYPE table_type IS TABLE OF emp%ROWTYPE
         INDEX BY BINARY_INTEGER
   ;

   pt1   table_type;
   rcur  sys_refcursor;

BEGIN

   OPEN c;
   FETCH c BULK COLLECT INTO pt1;
   CLOSE c;

  open rcur for
    select * from table(pt1);
END;
/

报错详情

select * from table(pt1);
                        *
ERROR at line 23:
ORA-06550: line 23, column 25:
PLS-00382: expression is of wrong type
ORA-06550: line 23, column 19:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 23, column 5:
PL/SQL: SQL Statement ignored

原因分析

你定义的table_type是带INDEX BY BINARY_INTEGER的关联数组(索引表),属于PL/SQL专属类型,无法被SQL引擎识别,因此不能在SQL语句的TABLE()函数中使用。

最简洁的解决方法

将PL/SQL表类型修改为无索引的嵌套表类型(去掉INDEX BY BINARY_INTEGER子句),使类型兼容SQL层,即可在TABLE()中调用。

修改后的代码:

DECLARE
   CURSOR c
   IS
      SELECT *
      from emp
      offset 0 rows fetch first 10 rows only;

   -- 移除INDEX BY BINARY_INTEGER,改为嵌套表类型
   TYPE table_type IS TABLE OF emp%ROWTYPE;

   pt1   table_type;
   rcur  sys_refcursor;

BEGIN
   OPEN c;
   FETCH c BULK COLLECT INTO pt1;
   CLOSE c;

   open rcur for
      select * from table(pt1);
END;
/

补充说明

如果需要保留关联数组的特性,也可以通过将关联数组转换为嵌套表的方式实现,但直接修改类型是最简洁的方案。

内容的提问来源于stack exchange,提问作者mpapec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:21:57