2017-05-31 64 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/ ) –