客户数据库出现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语句而言,只需要替换所有的中文字符,就可以避免这个错误的产生。