输入参数中的PLSQL特殊字符未被传递

时间:2017-05-31 07:50:41

标签: oracle plsql oracle11g sqlplus

请在下面找到我的功能:

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.

2 个答案:

答案 0 :(得分: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来获取终端的字符集。

答案 1 :(得分:0)

Oracle将μ的ASCII代码返回为49845(在我的例子中)。但是,在互联网上提供的ASCII图表中,μ的ASCII码是230。所以肯定49845 ascii代码从数据库到客户端机器转换为一些“我不知道”的数字。