首页 > 解决方案 > ORA-00600: 编译返回流水线的函数时出现内部错误代码

问题描述

我有一个包含如下代码的包规范

CURSOR my_cur   IS      
select ...;   

TYPE mytype IS TABLE OF my_cur%ROWTYPE;   

FUNCTION myfun       
RETURN mytype  PIPELINED; 

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

ORA-00600 : 内部错误代码, 参数: [psdmsc.c: spawned type invalid], [0x1ED93D3C10], [3], [], [], [], [], [], [], [], [ ],[]

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

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

标签: oracleplsqlplsql-package

解决方案


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

错误可能是由于编译流水线函数返回 PL/SQL 表my_cur%ROWTYPE时遇到以下情况:

  • my_cur中引用的游标[或表]my_cur%ROWTYPE属于与函数不同的架构
  • 另一个模式中的另一个函数与失败的函数同名
  • thisother function指的是与失败函数相同的游标[或表],
  • other function与游标[或表]在相同的模式中或在不同的模式中。

如需解决方法,请连接到 sys [或 system],并通过以下方式检查具有无效状态的对象

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   

然后编译返回的类型

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

可能会为另一种类型返回 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

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

SQL> alter package USER1.mypackage compile;     

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


推荐阅读