2009-08-24 108 views
1

我试图从Oracle表中提取数据。该列被定义为char(40)并包含扩展的ASCII值。目前在SQL * Plus中,扩展字符显示为“颠倒”问号。我需要能够提取具有十进制值> 128的ASCII字符并以扩展或8位编码方案显示。
Oracle ASCII字符集 - .Net扩展

- 电流输出

从MYTABLE选择MyField的;

[email protected]¿pmxJ¿¿¿.¿¿¿P9¿¿¿¿¿+¿¿w)¿@Ÿ@B¿¿¿


- 十进制值

典型值= 96长度= 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> SELECT * FROM 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 AM

NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT HH.M I.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

没有什么错,除了ONC年底额外paranthesis。

也可以试试这个功能。

创建或替换函数str_ascii(pin in char)返回字符是 ret_val varchar2(100); ch char(1); begin begin for n in 1 ..(pin)循环 如果ret_val不为空然后 ret_val:= ret_val ||','; end if; ch:= substr(pin,n,1); ret_val:= ret_val || ASCII(CH); end loop; 结束; return ret_val; 结束;

阿齐兹

+0

代码是通过正确缩进输入的b它在这里以连续格式显示。无论如何,你可以按下输入后;使之可读 – Aziz 2009-11-17 16:15:18

0

你已经有了一个问题。数据库字符集(NLS_CHARACTERSET)是US7ASCII。这意味着数据库仅支持CHAR列中的7位ASCII字符。数据库不支持在你所指的任何Windows代码页上使用128以上的任何字符(我的猜测是Windows-1252,但有很多可能性)。

你在这个数据库中有多少数据?数据库是否被其他应用程序使用?这些应用程序看起来是否工作正常?

理想情况下,您将能够使用适当的字符集(最有可能的WE8MSWIN1252或AL32UTF8)重新创建数据库,重新加载数据,并且生活会很好。但是,如果您现有的应用程序似乎能够正常工作,那么这将表明您的应用程序依赖于绕过Oracle客户端中的字符集转换代码,这会打开一个令人痛苦的其他来源。

+0

您好贾斯汀, 有上百万的记录在数据库中,并有一级ERP系统与数据库交互。有没有办法从列中传递小数值?我只需要访问前20个职位。 ASCII(SUBSTR(MYCOL,1,1)+ '' + SUBSTR(MYCOL,2,1).... 感谢, 布伦南 – 2009-08-24 18:28:05

1

您NLS_CHARACTERSET定义为:

NLS_CHARACTERSET US7ASCII 

因此,Oracle将只能保证标准的ASCII字符可以存储 你必须要么

  • 改变你的数据库字符集的东西,它允许扩展字符,例如:UTF-8

  • 将字段从CHAR更改为NCHAR。 NCHAR列将选择NLS_NCHAR CHARACTERSET,我可以看到它设置为UTF-8。

另外,您确定要使用CHAR而不是VARCHAR吗? CHAR字段填充为总是40个字符。 NVARCHAR是长达40个字符的字段。

就是这么说,如果你设法将非ascii字符填充到US7ASCII字段中,有时可以将数据库字符集转换成类似WE8ISO8859P1的东西。 见

http://download.oracle.com/docs/cd/B10501_01/server.920/a96529/ch2.htm#101203

+0

你好志,
感谢您的快速响应。有方式为char“上即时”使用的是Oracle功能的转换。我不会要能够转换数据库。
感谢, 布伦南 – 2009-08-24 18:29:54

+0

CONVERT(FIELD_NAME“WE8ISO8859P1”,“US7ASCII” )可能工作尽管如此,如果您不更改数据库字符集或切换到使用NCHAR,那么您处于不受支持的地区 – Chi 2009-08-24 18:49:21