Oracle CAST到NVARCHAR2的奇怪行为

时间:2013-05-24 13:11:36

标签: oracle oracle10g

我有以下查询:

SELECT (CAST("META_SECT_ORDER" AS NVARCHAR2(3)) || '#' || "CODE") AS "SECTION"
FROM "BMAN_TP2"."LOADER_TEMPLATE_SECTIONS"

META_SECT_ORDER显然是整数,而CODE是字符串。

它输出700行,如下所示:

SECTION
-------
 0#F01
 0#I05
 1#I05
 2#I05

等...

我知道CAST不是必需的,但查询由底层查询构建器组成,该构建器也为MsSQL Server(需要CAST)和Postgres输出。

奇怪的是,如果我提高NVARCHAR2长度,我会获得不同的结果。例如:

  • 值<= 80,我得到了正确的结果(见上文)

  • 的值为81,我获得了700行쥴ឋ醴ఀ퉶൐凨쓥昁菄ࢋ䖼譕貉ႋ䖼莀鐋

  • 值为82,我得到700行ਖଆ

  • 奇数值,在[83-127]中,我得到700个空行

  • 偶数值,在[84-128]中,我得到700行ڢ

  • 值为&gt; = 129,我得到ORA-03113: end-of-file on communication channel

那是什么??

编辑:

实际上,它似乎只取决于CAST,连接是不相关的。

1 个答案:

答案 0 :(得分:2)

这看起来像“Bug 9949330 - ORA-7445或将数字转换为NVARCHAR2的乱码数据”。您已经发现了正式的解决方法,使用值&lt; = 80。

您应该联系支持部门下载补丁程序或为您的平台请求补丁程序。

这是一种在不使用任何数据的情况下重现问题的简便方法。截至11.2.0.3,它仍然失败。

SQL> select cast(level as nvarchar2(130)) from dual connect by level <= 1;

CAST(LEVELASNVARCHAR2(130))
--------------------------------------------------------------------------------
ååååååååå┐┐┐ ┐┐  ┐┐A ┐┐  ┐┐A ┐┐  A   ┐┐  ┐   ┐┐  ┐┐A