未传递输入参数中的 PLSQL 特殊字符
PLSQL Special Character in input parameter is not being passed
请在下面找到我的函数:
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
返回值 = 1
请告知为什么没有传递特殊字符以及如何修复它。
-Oracle Version: 11g
-Linux: RHEL 7.2
-Script executed using sqlplus.
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 位的 32 位 Oracle Windows)。
查看此 post 了解更多详情:
我才知道,你用的是Linux,不是Windows。使用 locale charmap
或 echo $LANG
而不是 chcp
来获取终端的字符集。
Oracle 将 µ 的 ASCII 代码返回为 49845(在我的例子中)。然而,根据互联网上可用的 ASCII 图表中提到的,µ 的 ASCII 码是 230。因此,当转换为某个 "I dont know " 数字时,从数据库到客户端机器的 49845 ascii 代码肯定是。
请在下面找到我的函数:
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 返回值 = 1
请告知为什么没有传递特殊字符以及如何修复它。
-Oracle Version: 11g
-Linux: RHEL 7.2
-Script executed using sqlplus.
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 位的 32 位 Oracle Windows)。
查看此 post 了解更多详情:
我才知道,你用的是Linux,不是Windows。使用 locale charmap
或 echo $LANG
而不是 chcp
来获取终端的字符集。
Oracle 将 µ 的 ASCII 代码返回为 49845(在我的例子中)。然而,根据互联网上可用的 ASCII 图表中提到的,µ 的 ASCII 码是 230。因此,当转换为某个 "I dont know " 数字时,从数据库到客户端机器的 49845 ascii 代码肯定是。