【发布时间】:2012-01-02 15:29:23
【问题描述】:
我遇到了一个我还无法解释的问题。我有一个带数字的代码,使用 NCHR 获取该数字的国家字符代码,然后对其执行 RAWTOHEX 转换。
它在 10g 中工作了多年。当我们升级到 11g 时,它开始返回不同的值。我将其归结为几条语句,并创建了一个演示脚本:
SET SERVEROUTPUT ON;
DECLARE
rawVar RAW(2000);
nVar NVARCHAR2(1000);
BEGIN
nVar := NCHR(1112);
SELECT RAWTOHEX(nVar) INTO rawVar FROM DUAL;
DBMS_OUTPUT.PUT_LINE('rawVar: ' || rawVar);
END;
/
在 10g 中执行时,输出为“0458”。在 11g 中(来自同一台计算机并使用相同的 Oracle 客户端软件)输出为“00040058”。依赖输出的上游进程期待“0458”。
有趣的是(对我而言),如果我将 nVar 的定义更改为 VARCHAR2 而不是 NVARCHAR2,我会在 11g 上得到“0458”作为输出。
有人可以帮忙解释为什么结果不同吗?我搜索了 Oracle 的发行说明和支持系统,但没有找到任何答案。
非常感谢。
【问题讨论】:
-
你能从 SQL 环境中运行它吗:select nchr(1112) nchr, rawtohex(nchr(1112)) rth from dual;
-
两个环境sreutrn相同,NCHR是“?” RTH 是“0458”
-
所以,似乎在 dbms_output 中转换为 varchar 会影响值 - 这是否类似于您的上游进程接收值的方式?
-
在上游进程中,原始变量通过 JDBC 传递回 Java 应用程序。从那里分析这些位并将其转换回原始值(漫长的过程)。使用相同的代码,我在 10g 和 11g 中得到两个不同的结果——这是我想不通的。
标签: oracle