2009-08-24 94 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