ORA-00600: 编译函数返回 Pipelined 时的内部错误代码

ORA-00600: internal error code when compiling function returning Pipelined

我有一个包规范,代码如下

CURSOR my_cur   IS      
select ...;   

TYPE mytype IS TABLE OF my_cur%ROWTYPE;   

FUNCTION myfun       
RETURN mytype  PIPELINED; 

当我尝试编译包规范时,出现以下错误:

ORA-00600: internal error code, arguments: [psdmsc.c: spawned type invalid], [0x1ED93D3C10], [3], [], [], [], [], [], [], [], [], []

有趣的是,包含此函数的包主体编译得很好。

我认为结果集可能会导致问题,但我的游标中的查询 returns 最多 1 行

此问题可能会在数据库的这些版本范围内遇到。

编译流水线函数return编译my_cur%ROWTYPE的PL/SQLtable时出现以下情况可能会出现错误:

  • my_cur%ROWTYPE 中引用的
  • 或 table] my_cur 属于 与函数不同的模式
  • 另一个模式中有另一个函数与 失败的功能
  • other function 指的是与失败函数相同的游标[或 table],
  • other function 与游标[或 table] 处于同一架构中,或者处于不同的架构中。

解决方法是连接到 sys [或系统],并通过

检查状态无效的对象
SQL> SELECT owner,object_name,status
  FROM dba_objects
 WHERE status = 'INVALID'
   AND object_type = 'TYPE'
   AND object_name LIKE 'SYS_PLSQL_%' 

OWNER OBJECT_NAME          STATUS
----- -------------------- --------
USER1 SYS_PLSQL_12345_2_1  INVALID   

然后编译类型returned

SQL> alter type USER1.SYS_PLSQL_12345_2_1 compile;
SQL> show error

可能 return PLS-00201 用于另一种类型,例如

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PL/SQL: Compilation unit analysis terminated
1/44 PLS-00201: identifier 'USER2.SYS_PLSQL_12346_7_1' must be declared 

然后将执行权限授予无效类型的所有者

SQL> grant execute on USER2.SYS_PLSQL_12346_7_1 to USER1;

然后重新编译无效类型

SQL> alter type USER1.SYS_PLSQL_12345_2_1 compile;
SQL> show error

并通过上述查询重新检查状态为无效的对象,如果return没有行, 然后可以安全地编译相关包

SQL> alter package USER1.mypackage compile;     

参考。来自 Oracle 支持的文档 ID 1185303.1

发现问题 - 在我的游标查询中,其中一个别名是保留关键字。使用转义字符并不能阻止它被视为保留关键字。有趣的是,查询本身运行良好,但阻止了函数编译