在 Oracle 11g2 XE 中编译 PL/SQL 函数有时会导致 ORA-00600:内部错误
Posted
技术标签:
【中文标题】在 Oracle 11g2 XE 中编译 PL/SQL 函数有时会导致 ORA-00600:内部错误【英文标题】:Compiling a PL/SQL function in Oracle 11g2 XE sometimes leads to a ORA-00600: internal error 【发布时间】:2015-01-30 12:58:07 【问题描述】:我有一个我正在使用的 PL/SQL 函数,它有时可以编译,但有时会给我这个错误。
ORA-00600: internal error code, arguments: [17285], [0x318FDE2C], [1], [0x273F1C60], [], [], [], [], [], [], [], []
00600. 00000 - "internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]"
*Cause: This is the generic internal error number for Oracle program
exceptions. This indicates that a process has encountered an
exceptional condition.
*Action: Report as a bug - the first argument is the internal error number
断开并重新连接到 Oracle,函数编译正常,感觉很疯狂......
谷歌搜索错误代码和参数给了我这个
ERROR:
ORA-600 [17285] [a] [b] [c]
VERSIONS:
versions 7.0 to 10.1
DESCRIPTION:
Oracle is in the process of deleting an instantiation object when it
discovers that the object is currently on the call stack.
This should not occur and so ORA-600 [17285] is reported.
ARGUMENTS:
Arg [a] Instantiation object
Arg [b] Call stack nesting level
Arg [c] Library Cache Object Handle
FUNCTIONALITY:
Kernel Generic Instantiation manager
IMPACT:
PROCESS FAILURE
NON CORRUPTIVE - no corruption to underlying data.
SUGGESTIONS:
This error is usually accompanied by another error. Please check for this.
我的函数返回一个流水线的自定义表类型。大部分功能代码都省略了...
CREATE TYPE t_solexp_row AS OBJECT (
obj VARCHAR(30),
dt DATE,
param VARCHAR(30),
param_id NUMBER,
val NUMBER,
change_time TIMESTAMP
);
/
CREATE TYPE t_solexp_tab IS TABLE OF t_solexp_row;
/
CREATE OR REPLACE FUNCTION get_solexp_tab(p_start_date IN DATE, p_end_date IN DATE) RETURN t_solexp_tab PIPELINED AS
BEGIN
...
LOOP
PIPE ROW(t_solexp_row(...,...,...,...,...,...);
END LOOP;
...
RETURN;
END;
/
知道什么可能导致这种行为吗?
【问题讨论】:
你可以尝试为数组大小指定一个 LIMIT 看看它是否仍然发生。 @LalitKumarB 你建议我在哪里尝试添加限制?实际上没有任何数组存在。 您没有提供完整的代码。我以为会涉及到一个数组。当您进行批量收集时,您可以指定一个 LIMIT。这作为在内存中构建数组的限制。您会期望在每个数组中获得有限数量的行。这同样适用于上下文切换。 无论如何,很高兴您找到了根本原因并将其作为答案分享。 +1 @LalitKumarB 谢谢你的建议,我不知道 :) 【参考方案1】:这不是作为一个自我回答的问题计划的,但我在写它时有了一个想法,谢谢 ***! :)
我正在 SQL Developer 中开发和测试该功能。结果集中的行数从几到几千不等,具体取决于参数。
我注意到只有当最后一个结果集包含超过 50 条记录时才会出现此问题。
问题似乎是 SQL Developer 最初只从 oracle 获取前 50 行,重新编译该函数且数据仍在管道中会导致 ORA-00600。看起来合理且符合错误描述
Oracle is in the process of deleting an instantiation object when it
discovers that the object is currently on the call stack.
This should not occur and so ORA-600 [17285] is reported.
唷,很高兴它现在可以工作了!来自数据库引擎的内部错误足以让我不寒而栗。
【讨论】:
这会导致错误是有道理的。但是 ORA-600 总是一个 bug;这些错误会生成跟踪文件并且无法被捕获。我希望这个问题会产生像ORA-08103: object no longer exists
这样的错误。
Toad 中出现同样的问题,加载所有行即可解决。以上是关于在 Oracle 11g2 XE 中编译 PL/SQL 函数有时会导致 ORA-00600:内部错误的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 11g XE "alter table drop column" 导致 ORA-00600
尝试在 XE 中访问 RAD Studio 10.2 编译库时出现链接错误