Oracle CAST 到 NVARCHAR2 的奇怪行为

Tee*_*jay 5 oracle oracle10g

我有以下查询:

\n\n
SELECT (CAST("META_SECT_ORDER" AS NVARCHAR2(3)) || \'#\' || "CODE") AS "SECTION"\nFROM "BMAN_TP2"."LOADER_TEMPLATE_SECTIONS"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

它输出 700 行,如下所示:

\n\n
SECTION\n-------\n 0#F01\n 0#I05\n 1#I05\n 2#I05\n
Run Code Online (Sandbox Code Playgroud)\n\n

ETC...

\n\n

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

\n\n

奇怪的事实是,如果我提高NVARCHAR2我会得到不同的结果。例如:

\n\n
    \n
  • 当值 <= 80 时,我得到正确的结果(见上文)

  • \n
  • 值为 81,我得到 700 行\xec\xa5\xb4\xe1\x9e\x8b\xe9\x86\xb4\xe0\xb0\x80\xed\x89\xb6\xe0\xb5\x90\xe5\x87\xa8\xec\x93\xa5\xe6\x98\x81\xe8\x8f\x84\xe0\xa2\x8b\xe4\x96\xbc\xe8\xad\x95\xe8\xb2\x89\xe1\x82\x8b\xe4\x96\xbc\xe8\x8e\x80\xe9\x90\x8b

  • \n
  • 值为 82,我得到 700 行\xe0\xa8\x96\xe0\xac\x86

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

  • \n
  • 对于偶数值,在 [84-128] 中,我得到 700 行\xda\xa2

  • \n
  • 值 >= 129,我得到ORA-03113: end-of-file on communication channel

  • \n
\n\n

那是什么??

\n\n

编辑 :

\n\n

事实上,这似乎只取决于CAST,串联并不相关。

\n

Jon*_*ler 4

这看起来像“Bug 9949330 - ORA-7445 或将 NUMBER 转换为 NVARCHAR2 时出现乱码数据”。您已经发现了官方的解决方法,使用 <= 80 的值。

\n\n

您应该联系支持人员下载补丁或请求适用于您的平台的补丁。

\n\n

这是一种无需使用任何数据即可重现问题的更简单方法。从 11.2.0.3 开始仍然失败。

\n\n
SQL> select cast(level as nvarchar2(130)) from dual connect by level <= 1;\n\nCAST(LEVELASNVARCHAR2(130))\n--------------------------------------------------------------------------------\n\xc3\xa5\xc3\xa5\xc3\xa5\xc3\xa5\xc3\xa5\xc3\xa5\xc3\xa5\xc3\xa5\xc3\xa5\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90 \xe2\x94\x90\xe2\x94\x90  \xe2\x94\x90\xe2\x94\x90A \xe2\x94\x90\xe2\x94\x90  \xe2\x94\x90\xe2\x94\x90A \xe2\x94\x90\xe2\x94\x90  A   \xe2\x94\x90\xe2\x94\x90  \xe2\x94\x90   \xe2\x94\x90\xe2\x94\x90  \xe2\x94\x90\xe2\x94\x90A\n
Run Code Online (Sandbox Code Playgroud)\n