今天测试一段PL/SQL代码的时候发现了这个错误。导致错误的原因和索引表的索引表有关。
似乎有点绕嘴,详细的描述应该是在9ir2环境中,向一个二维索引表批量插入数据,就会导致这个错误。
SQL> select * FROM V$VERSION;
BANNER
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> INSERT INTO T select ROWNUM, TNAME FROM TAB;
已创建73行。
SQL> COMMIT;
提交完成。
SQL> DECLARE
2 TYPE T_T IS TABLE OF T%ROWTYPE INDEX BY BINARY_INTEGER;
3 V_T T_T;
4 BEGIN
5 select * BULK COLLECT INTO V_T FROM T;
6 END;
7 /
PL/SQL 过程已成功完成。
SQL> DECLARE
2 TYPE T_T IS TABLE OF T%ROWTYPE INDEX BY BINARY_INTEGER;
3 TYPE T_T_T IS TABLE OF T_T INDEX BY BINARY_INTEGER;
4 V_T T_T_T;
5 BEGIN
6 select * INTO V_T(1)(1) FROM T WHERE ROWNUM = 1;
7 END;
8 /
PL/SQL 过程已成功完成。
SQL> DECLARE
2 TYPE T_T IS TABLE OF T%ROWTYPE INDEX BY BINARY_INTEGER;
3 TYPE T_T_T IS TABLE OF T_T INDEX BY BINARY_INTEGER;
4 V_T T_T_T;
5 BEGIN
6 select * BULK COLLECT INTO V_T(1) FROM T;
7 END;
8 /
SELECT * BULK COLLECT INTO V_T(1) FROM T;
*第 6 行出现错误:
ORA-03113: 通信通道的文件结束
可以看到索引表的批量插入和二维索引表的单条记录插入都没有问题,当批量对二维索引表执行插入时前台报错ORA-3113错误,而alert文件中对应的就是这个ORA-7445错误:
Errors in file /opt/ora9/admin/testdata/udump/testdata_ora_4285.trc:
ORA-07445: 出现异常: 核心转储 [pdtisq_record_explode()+319] [SIGSEGV] [Address not mapped to object] [0x8] [] []
而在10g中则不会出现这个错误:
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> select * FROM V$VERSION;
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> INSERT INTO T select ROWNUM, TNAME FROM TAB;
已创建22行。
SQL> COMMIT;
提交完成。
SQL> DECLARE
2 TYPE T_T IS TABLE OF T%ROWTYPE INDEX BY BINARY_INTEGER;
3 TYPE T_T_T IS TABLE OF T_T INDEX BY BINARY_INTEGER;
4 V_T T_T_T;
5 BEGIN
6 select * BULK COLLECT INTO V_T(1) FROM T;
7 END;
8 /
PL/SQL 过程已成功完成。
这个错误在metalink上没有十分类似的描述,有一个例子错误是发生在RETURN BUCK COLLECT INTO语句中。虽然metalink没有说明,但是根据测试可以确定,这个问题只对9I有影响,10g已经修正了这个bug。
3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/