ORA-600(qerrmOStart2)(1756)错误

客户数据库出现ORA-600(qerrmOStart2)(1756)错误。
ORA-600(qerrmOStart2)错误:http://yangtingkun.itpub.net/post/468/527461
之前遇到过一次类似的qerrmOStart2错误,不过上次错误的第二个参数是1740。在上一篇文章中已经提到了,这个600错误只是一个表现,实际上真正的错误是第二个函数中体现的错误。
看一下具体的错误TRACE信息:

*** SERVICE NAME:(SYS$USERS) 2012-05-24 17:23:39.684
*** SESSION ID:(598.169) 2012-05-24 17:23:39.684
*** 2012-05-24 17:23:39.684
ksedmp: internal OR fatal error
ORA-00600: internal error code, arguments: [qerrmOStart2], [1756], [ORA-01756: quoted string NOT properly TERMINATED
], [], [], [], [], []
CURRENT SQL statement FOR this SESSION:
SELECT COUNT(*) FROM (  SELECT * FROM ( 
				 SELECT i_t 交易编号,
        decode(TYPE, '00500', '退货'),
        am,
        decode(flag, 'S', '成功', '失败')
   FROM usr1.t_1@db01
  WHERE s_p = '3702491300'
    AND o_i_t = 96924977
			) t WHERE rownum <= 3000 ) tt 
----- Call Stack Trace -----
calling              CALL     entry                argument VALUES IN hex      
location             TYPE     point                (? means dubious VALUE)     
-------------------- -------- -------------------- ----------------------------
ksedst+001c          bl       ksedst1              000000000 ? FFFFFFFFFFF78A4 ?
ksedmp+0290          bl       ksedst               104A506E8 ?
ksfdmp+0018          bl       03F4BE78             
kgerinv+00dc         bl       _ptrgl               
kgesinv+0020         bl       kgerinv              FFFFFFFFFFF7BF0 ? 000000000 ?
                                                   10032BE9C ? 000000000 ?
                                                   000000000 ?
ksesin+006c          bl       kgesinv              000000000 ? 000000000 ?
                                                   FFFFFFFFFFF7C60 ? 1104B63E8 ?
                                                   11048EFB0 ?
OCIKSIN+0124         bl       ksesin               105383C74 ? 200000002 ?
                                                   000000000 ? 0000006DC ?
                                                   000000001 ? 000000031 ?
                                                   FFFFFFFFFFF7C64 ?
                                                   FFFFFFFFFFF7C94 ?
qerrmOStart+01d4     bl       03F49D20             
qerrmStart+0310      bl       qerrmOStart          000000001 ? 110471728 ?
                                                   110489E88 ?
selexe+09d0          bl       01FB6A3C             
opiexe+26fc          bl       selexe               110489E88 ? 700000917096A00 ?
                                                   102387EB0C8 ?
kpoal8+0edc          bl       opiexe               FFFFFFFFFFFB874 ?
                                                   FFFFFFFFFFFB4E8 ?
                                                   FFFFFFFFFFF9A48 ?
opiodr+0ae0          bl       _ptrgl               
ttcpip+1020          bl       _ptrgl               
opitsk+1124          bl       ttcpip               1100CB0D8 ? FFFFFFFFFFFB990 ?
                                                   000000001 ? 000000000 ?
                                                   FFFFFFFFFFFB910 ? 1100E0428 ?
                                                   000000000 ? 1104D0240 ?
opiino+0990          bl       opitsk               000000000 ? 000000000 ?
opiodr+0ae0          bl       _ptrgl               
opidrv+0484          bl       01FB7E64             
sou2o+0090           bl       opidrv               3C02AB90DC ? 440660000 ?
                                                   FFFFFFFFFFFF7B0 ?
opimai_real+01bc     bl       01FB5C2C             
main+0098            bl       opimai_real          000000000 ? 000000000 ?
__start+0098         bl       main                 000000000 ? 000000000 ?
--------------------- Binary Stack Dump ---------------------

从SQL语句本身分析,并不存在任何的语法错误,所有的单引号都是匹配的,而这种600错误的产生本身也说明不是简单的普通错误。
观察到这个SQL是通过数据库链访问远端表,且SQL语句本身包含了中文,那么出现这个问题就不奇怪了。显然导致问题的原因在于两个数据库的字符集不同,Oracle在进行字符集转换的时候把某个中文错误的分解出了一个单引号,导致语法分析时报错。
避免这个错误的最行之有效的方法就是去掉多字节字符,对于当前的SQL语句而言,只需要替换所有的中文字符,就可以避免这个错误的产生。

This entry was posted in BUG and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *