我正在尝试从Oracle表中提取数据。该列定义为char(40)并包含扩展的ASCII值。目前在SQL * Plus中,扩展字符显示为“颠倒”问号。我需要能够提取具有小数值>的ASCII字符。 128并以扩展或8位编码方案显示。
- 电流输出
从Mytable中选择myfield;
b@¿pmxJ¿¿¿.¿¿¿P9¿¿¿¿¿+¿¿w)¿@ Y @B¿¿¿
- 十进制值
Typ = 96 Len = 40:
98,64,189,112,109,120,74,156,27,231,167,46,224,28,130,183,80,57,202,232,150,239,144,43,169,1,186,119,41,254,64,89,64,12,19,8,66,194,136,210
- 数据库字符集
SQL>从NLS_DATABASE_PARAMETERS中选择*;
参数值
------------------------------ ----------------- -----------------------
NLS_CSMIG_SCHEMA_VERSION 5
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS。,
NLS_CHARACTERSET US7ASCII
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
参数值
------------------------------ ----------------- -----------------------
NLS_TIME_FORMAT HH.MI.SSXFF上午
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET UTF8
NLS_RDBMS_VERSION 10.2.0.3.0
我对Oracle没有太多经验。任何帮助将不胜感激!
谢谢, 布伦南
我能够以十进制格式提取数据并在.Net函数中处理它而没有问题。 SQL语句有点乱。我正在尝试编写一个函数来协助查询。我在创建函数时遇到了问题。
当前的SQL语句:
select DECRYPTDATA(
ASCII(SUBSTR(ACTIONCD,1,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,2,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,3,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,4,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,5,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,6,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,7,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,8,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,9,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,10,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,11,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,12,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,13,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,14,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,15,1)) || ',' ||
ASCII(SUBSTR(ACTIONCD,16,1)), '1' )
from ORDERACTIONS where KEYNUM = 1
我想快速函数返回此字符串。
以下是无法编译的功能。有什么建议吗?
create or replace function ASCIITODEC(p_actioncd VARCHAR2)
return VARCHAR2 is
begin
return ASCII(SUBSTR(p_actioncd,1,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,2,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,3,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,4,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,5,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,6,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,7,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,8,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,9,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,10,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,11,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,12,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,13,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,14,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,15,1)) || ',' ||
ASCII(SUBSTR(p_actioncd,16,1)) )
end ASCIITODEC;
/
谢谢, 布伦南
答案 0 :(得分:1)
您的NLS_CHARACTERSET定义为:
NLS_CHARACTERSET US7ASCII
因此,oracle只保证可以存储标准的ASCII字符 你必须
OR
另外,您确定要使用CHAR而不是VARCHAR吗? CHAR字段填充为总是40个字符长。 NVARCHAR是最多40个字符的字段。
所有这一切,如果你确实设法将非ascii字符填充到US7ASCII字段中,有时可以将数据库字符集转换为类似WE8ISO8859P1的字符串。 见
http://download.oracle.com/docs/cd/B10501_01/server.920/a96529/ch2.htm#101203
答案 1 :(得分:0)
你遇到了问题。数据库字符集(NLS_CHARACTERSET)是US7ASCII。这意味着数据库仅支持CHAR列中的7位ASCII字符。数据库不支持在你所指的任何Windows代码页上使用128以上的任何字符(我的猜测是Windows-1252,但有很多可能性)。
您在这个数据库中有多少数据?数据库是否被其他应用程序使用?这些应用程序看起来是否正常工作?
理想情况下,您可以使用正确的字符集(最有可能是WE8MSWIN1252或AL32UTF8)重新创建数据库,重新加载数据,生活会很好。但是,如果现有的应用程序似乎有效,则表明您的应用程序依赖于绕过Oracle客户端中的字符集转换代码,从而打开了另一个痛苦的来源。
答案 2 :(得分:0)
除了onc额外的paranthesis之外没有任何错误。
也可以尝试这个功能。
创建或替换函数str_ascii(pin in char)返回char是 ret_val varchar2(100); ch char(1); 开始 开始 for n in 1 .. length(pin)loop 如果ret_val不为null则 ret_val:= ret_val ||','; 万一; ch:= substr(pin,n,1); ret_val:= ret_val || ASCII(CH); 结束循环; 结束; return ret_val; 端;
阿齐兹