在测试访问远端LOB时,碰到了这个错误。
编写了一个很简单的函数,通过调用远端的这个函数返回LOB字段,结果出现了这个ORA-7445错误。
[oracle@yans1 ~]$ sqlplus test/test
SQL*Plus: Release 10.2.0.3.0 - Production on 星期六 5月 29 07:04:21 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> CREATE TABLE T_LOB (ID NUMBER, CONTENTS CLOB);
Table created.
SQL> DECLARE
2 V_LOB CLOB;
3 BEGIN
4 INSERT INTO T_LOB
5 VALUES (1, EMPTY_CLOB())
6 RETURN CONTENTS INTO V_LOB;
7 FOR I IN 1..100 LOOP
8 DBMS_LOB.WRITEAPPEND(V_LOB, 32767, LPAD('A', 32767, 'A'));
9 END LOOP;
10 END;
11 /
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> CREATE OR REPLACE FUNCTION F_LOB (P_ID IN NUMBER)
2 RETURN CLOB AS
3 V_LOB CLOB;
4 BEGIN
5 SELECT CONTENTS
6 INTO V_LOB
7 FROM T_LOB
8 WHERE ID = P_ID;
9 RETURN V_LOB;
10 END;
11 /
Function created.
在一个10g环境中,建立了一个包含LOB字段的表,并插入记录。然后建立了一个根据ID返回LOB结果的函数,下面在远端数据库中调用这个函数:
[oracle@localhost ~]$ sqlplus TEST/TEST
SQL*Plus: Release 9.2.0.4.0 - Production on 星期六 5月 29 06:49:37 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
SQL> CREATE DATABASE LINK TEST08 USING 'TEST08';
数据库链接已创建。
SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME@TEST08;
GLOBAL_NAME
------------------------------------------------------------------------------------------
TEST08
SQL> SELECT DBMS_LOB.GETLENGTH@TEST08(F_LOB@TEST08(1)) FROM T_LOB@TEST08;
DBMS_LOB.GETLENGTH@TEST08(F_LOB@TEST08(1))
------------------------------------------
3276700
SQL> SELECT F_LOB@TEST08(1) FROM T_LOB@TEST08;
ERROR:
ORA-03113: 通信通道的文件结束
未选定行
通过DBMS_LOB对返回的LOB在远端进行处理后,可以得到正常的结果,如果尝试直接访问LOB,肯定是会出现错误的,但是不应该出现ORA-3113以及后台的ORA-7445错误:
Errors in file /opt/ora9/admin/testcen/udump/testcen_ora_14259.trc:
ORA-07445: 出现异常: 核心转储 [kollalfn()+21] [SIGSEGV] [Address not mapped to object] [0xC] [] []
对应的trace信息为:
[oracle@localhost bdump]$ more /opt/ora9/admin/testcen/udump/testcen_ora_14259.trc
/opt/ora9/admin/testcen/udump/testcen_ora_14259.trc
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
ORACLE_HOME = /opt/ora9/product/9.2
System name: Linux
Node name: localhost.localdomain
Release: 2.6.9-5.ELsmp
Version: #1 SMP Wed Jan 5 19:30:39 EST 2005
Machine: i686
Instance name: testcen
Redo thread mounted by this instance: 1
Oracle process number: 17
Unix process pid: 14259, image: oracle@localhost.localdomain (TNS V1-V3)
*** 2010-05-29 08:24:22.838
*** SESSION ID:(16.1063) 2010-05-29 08:24:22.799
Exception signal: 11 (SIGSEGV), code: 1 (Address not mapped to object), addr: 0xc, PC: [0x979e3d5, kollalfn()+21]
Registers:
%eax: 0x00000000 %ebx: 0x0a4b929c %ecx: 0x00000056
%edx: 0x00000000 %edi: 0xb7a22b60 %esi: 0x0a4b929c
%esp: 0xbfff6584 %ebp: 0xbfff6658 %eip: 0x0979e3d5
%efl: 0x00010286
kollalfn()+9 (0x979e3c9) mov %edi,0xfffffff8(%ebp)
kollalfn()+12 (0x979e3cc) mov %esi,0xfffffffc(%ebp)
kollalfn()+15 (0x979e3cf) mov %ebx,0xfffffff4(%ebp)
kollalfn()+18 (0x979e3d2) mov 0x8(%ebp),%eax
> kollalfn()+21 (0x979e3d5) mov 0xc(%eax),%esi
kollalfn()+24 (0x979e3d8) mov 0xc(%esi),%edx
kollalfn()+27 (0x979e3db) mov 0x10(%edx),%ecx
kollalfn()+30 (0x979e3de) call 0x979e3e3
kollalfn()+35 (0x979e3e3) pop %ebx
*** 2010-05-29 08:24:22.949
ksedmp: internal or fatal error
ORA-07445: 出现异常: 核心转储 [kollalfn()+21] [SIGSEGV] [Address not mapped to object] [0xC] [] []
Current SQL statement for this session:
SELECT F_LOB@TEST08(1) FROM T_LOB@TEST08
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedmp()+269 call ksedst()+0 1 ? 0 ? 0 ? 1 ? 33653900 ?
25003365 ?
ssexhd()+1108 call ksedmp()+0 3 ? 0 ? 0 ? 0 ? 0 ? 0 ?
__pthread_sighandle call ssexhd()+0 B ? BFFF6218 ? BFFF6298 ? 0 ?
r_rt()+92 0 ? 961CDFB8 ?
kollalfn()+21 signal __pthread_sighandle B ? BFFF6218 ? BFFF6298 ?
r_rt()+0
kpcxk2u()+7006 call kollalfn()+0 0 ? 56 ? 0 ? A8481AC ?
ttccDefineConvert() call kpcxk2u()+0 B7A13734 ? B7A22B88 ? C3 ?
+372 BFFFB860 ? 14 ? B7A11E8C ?
ttccpwg()+1137 call ttccDefineConvert() B7A13734 ? B7A22B60 ?
+0 B7A22B88 ? B7A11E8C ? 56 ?
70 ?
ttcfour()+371 call ttccpwg()+0 AD58FA0 ? B7A13734 ?
B7A22CC4 ? B7A22B60 ? 0 ? 0 ?
BFFF9B14 ? 0 ? 0 ? BFFF6B1C ?
ttcdrv()+1131 call ttcfour()+0 AD58FA0 ? B7A13734 ? 0 ? 0 ?
B7A22CC4 ? BFFF6B1C ?
nioqwa()+57 call ttcdrv()+0 BFFF9694 ? 0 ?
upirtrc()+1680 call nioqwa()+0 B7A137D8 ? 0 ? 969D848 ?
BFFF9694 ? B7A1375C ? 0 ?
kpurcsc()+172 call upirtrc()+0 B7A13734 ? 5E ? BFFF95C8 ?
BFFF9694 ? BFFFA2D4 ? 0 ? 0 ?
B7A22D10 ? 1 ? 0 ? 0 ?
kpufch0()+2554 call kpurcsc()+0 B7A2FD7C ? 5E ? BFFF95C8 ?
BFFF9694 ? BFFFA2D4 ? 0 ? 0 ?
B7A22D10 ? 1 ? 0 ? 0 ?
BFFF95B8 ?
kpufch()+765 call kpufch0()+0 B7A22CC4 ? AD7961C ?
BFFFB7FC ? 2 ? 0 ? B7A2FD7C ?
B7A136F4 ? 0 ? 0 ? 0 ? 0 ?
0 ?
OCIStmtFetch()+50 call kpufch()+0 B7A22CC4 ? AD7961C ? 0 ? 2 ?
0 ? 0 ?
kpnfch()+341 call OCIStmtFetch()+0 B7A22CC4 ? AD7961C ? 1 ? 2 ?
0 ?
opifch2()+1726 call kpnfch()+0 B7901DB8 ? B7A22CC4 ?
AD7961C ? 1 ? 2 ? 0 ?
opiall0()+4819 call opifch2()+0 89 ? 5 ? BFFFD06C ?
kpoal8()+1865 call opiall0()+0 5E ? 22 ? BFFFD118 ? 0 ?
BFFFD1B8 ? AD7915C ?
opiodr()+5238 call kjxsupd()+1003 5E ? 14 ? BFFFDC4C ?
ttcpip()+2124 call opiodr()+0 5E ? 14 ? BFFFDC4C ? 1 ?
opitsk()+1635 call ttcpip()+0 AD53500 ? 5E ? BFFFDC4C ? 0 ?
BFFFE524 ? BFFFE520 ?
opiino()+602 call opitsk()+0 0 ? 0 ? AD53500 ? ADAC8D0 ?
F2 ? 0 ?
opiodr()+5238 call kjxsupd()+1003 3C ? 4 ? BFFFF8F0 ?
opidrv()+517 call opiodr()+0 3C ? 4 ? BFFFF8F0 ? 0 ?
sou2o()+25 call opidrv()+0 3C ? 4 ? BFFFF8F0 ?
main()+182 call sou2o()+0 BFFFF8D4 ? 3C ? 4 ?
BFFFF8F0 ? 1 ? 0 ?
__libc_start_main() call main()+0 2 ? BFFFF964 ? BFFFF970 ?
+179 8208EF0 ? 0 ? 5CAA80 ?
.
.
.
在metalink上没有发现类似的描述,估计这种错误相对比较少见。错误本身不是什么大问题,但是不应该在普通报错的时候出现连接中断以及后台的ORA-7445错误。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
SQL> CREATE DATABASE LINK TESTCEN USING '172.25.88.94/TESTCEN';
Database link created.
SQL> SELECT F_LOB@TESTCEN(1) FROM T_LOB@TESTCEN;
ERROR:
ORA-22992: cannot use LOB locators selected from remote tables
no rows selected
通过10g调用9i上的函数返回LOB,就不会导致ORA-7445错误,而是报错ORA-22992,这是正常的结果。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-663993/ ,如需转载,请注明出处,否则将追究法律责任。