2017-05-31 91 views
2

请找我下面的功能:在输入参数PLSQL特殊字符是不被传递

CREATE OR REPLACE FUNCTION TESTER_TESTING ( P_STRING   IN VARCHAR2) 
RETURN NUMBER IS 
BEGIN 
Dbms_Output.Put_Line('P_STRING:'||P_STRING); 
return 1; 
END TESTER_TESTING; 
/

,当我从sqlplus中使用执行:

DECLARE 
    RetVal NUMBER; 
    P_STRING VARCHAR2(32767); 

BEGIN 
    P_STRING := '006µ-540'; 
    RetVal := VISION.TESTER_TESTING (P_STRING); 
    DBMS_OUTPUT.Put_Line('RetVal = ' || TO_CHAR(RetVal)); 
    DBMS_OUTPUT.Put_Line(''); 
COMMIT; 
END; 
/

输出是: P_STRING:006 ?? - 540 将RetVal = 1

Output

请告知为什么特殊字符没有通过&如何解决它。

-Oracle Version: 11g 
-Linux: RHEL 7.2 
-Script executed using sqlplus. 
+0

使用Toad执行时。它正确地传递了价值。 – pOrinG

回答

2

的SQL * Plus继承命令行字符编码。你可以通过chcp询问。

在开始sqlplus之前,您必须相应地设置NLS_LANG参数,例如,

C:\>chcp 
Active code page: 850 

C:\>SET NLS_LANG=.WE8PC850  
C:\>sqlplus ... 

当然,它也可以用其他方法,例如,

C:\>echo %NLS_LANG% 
NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 

C:\>chcp 1252 
Active code page: 1252 

C:\>sqlplus ... 

NLS_LANG可在登记处也设置,参见HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG(64位),RESP。 HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG(适用于64位Windows的32位Oracle)。

看一看这个职位的详细信息:OdbcConnection returning Chinese Characters as "?"

我刚才看到你使用Linux,而不是Windows。使用locale charmapecho $LANG而不是chcp来获取终端的字符集。

+0

嗨,你已经解释了什么与Windows一起工作良好,但我仍然在Linux中面临同样的问题。 $ LANG = en_US.UTF-8,我们的Oracle数据库有AMERICAN_AMERICA.AL32UTF8。请指教。谢谢你的时间。 – pOrinG

+0

也许你的终端程序不支持它。检查那里的设置。 –

+0

对于终端程序,我们使用PuTTY,其中我们提到了UTF-8作为远程字符集。 – pOrinG

0

Oracle返回μ的ASCII代码为49845(在我的情况下)。然而,在互联网上可用的ASCII图表中提到的μ的ASCII码是230。所以当转换为一些“我不知道”的数字时,肯定会有49845个ascii代码从数据库到客户端机器。

+0

'ASCII'是一个7位代码,根本不包含'μ'。 –

+0

我提到了http://www.asciitable.com/。它在扩展ascii代码下提到。但是49845(从oracle返回)肯定是其他的东西,我不明白 – Himanshu

+0

49845是用UTF-8编码的'μ',参见[Micro Sign U + 00B5](https://unicode-table.com/en/00B5/ ) –