1

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

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 行

4

2 回答 2

1

在 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

于 2020-01-30T20:24:03.613 回答
0

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

于 2020-01-31T15:11:11.930 回答