ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 对远端表使用NVL2的bug

对远端表使用NVL2的bug

原创 Linux操作系统 作者:yangtingkun 时间:2007-08-29 00:00:00 0 删除 编辑

今天发现一个奇怪的现在,在10g中对于远端表使用NVL2函数会报错。


错误现象如下:

SQL> SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST2;
SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST2
*
1 行出现错误:
ORA-22992:
无法使用从远程表选择的 LOB 定位器

数据库的版本为:

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

同样的问题在9204上没有出现:

SQL> select nvl2(tname, 1, 2) from tab@testdata;

NVL2(TNAME,1,2)
---------------
1
1
.
.
.
1
1

27 rows selected.

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 Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

再次观察错误,会发现很多奇怪的问题。

首先,这个SQLLOB类型应该一点都不沾边,奇怪的是居然报了一个和LOB相关的错误。

第二,在METALINK上居然找不到任何相关的信息。

第三,Oracle似乎没有执行就直接报错。

SQL> SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST2;
SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST2
*
1 行出现错误:
ORA-22992:
无法使用从远程表选择的 LOB 定位器


SQL> SELECT NVL(TNAME, 2) FROM TAB@TEST2;
SELECT NVL(TNAME, 2) FROM TAB@TEST2
*
1 行出现错误:
ORA-02019:
未找到远程数据库的连接说明

从上面就可以看到,Oracle还没有验证TEST2数据库链是否存在就已经报错了。通过SQL_TRACE也可以清晰的看到这一点:

SQL> ALTER SESSION SET SQL_TRACE = TRUE;

会话已更改。

SQL> SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST;
SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST
*
1 行出现错误:
ORA-22992:
无法使用从远程表选择的 LOB 定位器


SQL> ALTER SESSION SET SQL_TRACE = FALSE;

会话已更改。

检查TRACE文件,发现错误发生在PARSE阶段:

PARSING IN CURSOR #7 len=34 dep=0 uid=56 oct=42 lid=56 tim=3415881096 hv=3913151867 ad='34632404'
ALTER SESSION SET SQL_TRACE = TRUE
END OF STMT
EXEC #7:c=0,e=533,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=3415881091
=====================
PARSE ERROR #8:len=38 dep=0 uid=56 oct=3 lid=56 tim=3423307316 err=22992
SELECT NVL2(TNAME, 2, 3) FROM TAB@TES
*** 2007-08-24 16:41:50.765
=====================
PARSING IN CURSOR #2 len=35 dep=0 uid=56 oct=42 lid=56 tim=3427128854 hv=4067503723 ad='30f9484c'
ALTER SESSION SET SQL_TRACE = FALSE
END OF STMT
PARSE #2:c=0,e=544,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=3427128849
EXEC #2:c=0,e=571,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=3427130535

问题虽然奇怪,变通的解决方法到是很简单,使用DECODE来代替NVL2就可以了:

SQL> SELECT NVL(TNAME, 2) FROM TAB@TESTRAC.US.ORACLE.COM;

NVL(TNAME,2)
------------------------------
T
BIN$MXYcjz+AZwTgRAADujhFZw==$0

SQL> SELECT NVL2(TNAME, 2, 3) FROM TAB@TESTRAC.US.ORACLE.COM;
SELECT NVL2(TNAME, 2, 3) FROM TAB@TESTRAC.US.ORACLE.COM
*
1 行出现错误:
ORA-22992:
无法使用从远程表选择的 LOB 定位器


SQL> SELECT DECODE(TNAME, NULL, 3, 2) FROM TAB@TESTRAC.US.ORACLE.COM;

DECODE(TNAME,NULL,3,2)
----------------------
2
2

最后,这个错误在10.2.0.311.1.0.6中仍然存在。

SQL> conn yangtk/yangtk@ora11g已连接。
SQL> SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST;
SELECT NVL2(TNAME, 2, 3) FROM TAB@TEST
*
1 行出现错误:
ORA-22992:
无法使用从远程表选择的 LOB 定位器


SQL> SELECT * FROM V$VERSION;

BANNER
-----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -
Production PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

感觉Oracle还没有发现这个bug

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69404/,如需转载,请注明出处,否则将追究法律责任。

下一篇: ORA-600(923)错误
请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1954
  • 访问量
    10876571