Oracle21c存储过程中INDICES OF循环触发ORA-00600编译错误
存储过程编译报错ORA-00600的原因分析
问题场景
以下存储过程无法编译:
CREATE PROCEDURE P_Test IS TYPE intvec_t IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER; vec intvec_t := intvec_t(3 => 10, 1 => 11, 100 => 34); BEGIN FOR i IN INDICES OF vec LOOP null; END LOOP; END;
报错信息:
ERROR at line 1:
ORA-00600: internal error code, arguments: [kglidinsi1], [1], [], [], [], [], [], [], [], [], [], []
但结构相似的匿名块可以正常编译执行:
DECLARE TYPE intvec_t IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER; vec intvec_t := intvec_t(3 => 10, 1 => 11, 100 => 34); BEGIN FOR ty IN INDICES OF vec LOOP null; END LOOP; END;
原因分析
这是Oracle数据库的内部编译器bug。当在存储过程中使用INDICES OF循环遍历本地定义的关联数组类型时,PL/SQL编译器在处理类型元数据的逻辑模块(对应错误参数kglidinsi1)触发了内部异常。
匿名块与存储过程的编译逻辑存在差异:匿名块属于一次性执行的动态代码,编译器对其本地类型的处理流程更简单;而存储过程作为持久化数据库对象,编译器需要为其类型生成更复杂的元数据存储结构,这个过程中出现了逻辑漏洞,导致ORA-00600内部错误。
这类bug通常关联特定Oracle版本,需查看对应版本的官方补丁列表,应用Oracle发布的修复补丁解决问题。
内容的提问来源于stack exchange,提问作者Ольга Зайчук
相关产品推荐
相关产品推荐

