2015-05-07 17 views
0

注:我不能改變我想要一個字符存儲到具有與號碼數據類型列的表插入字符爲數字數據類型列

的數據類型。

我發現的工作是將字符值轉換爲ASCII,並從數據庫中檢索時將其轉換回字符。

我使用了幾個函數ASCII和ASCIISTR,但這些函數的限制是它們只轉換字符串的第一個字符。

所以就用傾卸功能

select dump('Puneet_kushwah1') from dual; 

結果:典型值= 96長度= 15:80,117,110,101,101,116,95,107,117,115,104,119,97,104,49

此功能是給所有的字符的ASCII值。然後我執行以下查詢

select replace(substr((DUMP('Puneet_kushwah1')),(instr(DUMP('Puneet_kushwah1'),':')+2)),',',' ') from dual; 

結果:80 117 110 101 101 116 95 107 117 115 104 119 97 104 49

然後我使用的特殊字符,以填補空間,這樣我可以取代它同時從數據庫中檢索。

select replace(substr((DUMP('Puneet_kushwah1')),(instr(DUMP('Puneet_kushwah1'),':')+2)),',','040') from dual; 

Result: 80040117040110040101040101040116040950401070401170401150401040401190409704010404049 

表定義:

create table test (no number); 

然後我插入它到表

INSERT into test SELECT replace(substr((DUMP('Puneet_kushwah1')),(instr(DUMP('Puneet_kushwah1'),':')+2)),',','040') from dual; 

問題1: 當我執行

select * from test; 

我得到

結果:8.004011704011E82

我想它只是轉換成數字。完全一樣,我插入。

問題2:

,然後當我執行選中我希望它返回的確切字符串。

請幫我試了很多功能。

在此先感謝。

+4

你想要做什麼似乎很反常。只需將該列聲明爲數據的適當類型即可。 –

+1

轉換爲數字有什麼意義? –

+1

你有麻煩了,如果你的角色可能包含一個左括號是十進制40 –

回答

3

雖然我建議不要這樣做,因爲這可能會導致錯誤和可能的維護噩夢,我確實喜歡挑戰,並且被迫自己做一些棘手的事情,以便使某些供應商的做法變得奇怪爲我們工作,所以我同情你,如果是這樣的話。所以,爲了它的樂趣檢查了這一點。

轉換爲十六進制,然後爲十進制並插入到數據庫(x_test都有一個編號列),然後選擇,轉換回:

SQL> insert into x_test 
    2 select to_number(rawtohex('Puneet_kushwah1'), rpad('X', length(rawtohex('Puneet_kushwah1')), 'X')) from dual; 

1 row created. 

SQL> select * from x_test; 

     col1 
---------- 
4.1777E+35 

SQL> SELECT utl_raw.cast_to_varchar2(hextoraw(trim(to_char(col1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')))) 
    2 FROM x_test; 

UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW(TRIM(TO_CHAR(col1,'XXXXXXXXXXXXXXXXXXXXXXXXXXXX 
-------------------------------------------------------------------------------- 
Puneet_kushwah1 

SQL> 
+0

@Gray_W感謝您的寶貴時間和努力,我真的很感激...我只有一個疑問,爲什麼你使用rawtohex和hextoraw .. –

5

由於Oracle數字只能存儲高達38位數的精度,因此無法獲取確切的字符串。

所以,如果你運行這個命令:

select cast(no as varchar2(100)) 
from test; 

您將獲得:

80040117040110040101040101040116040950400000000000000000000000000000000000000000000 
2

雖然這是一個可怕的想法和一個可怕的數據模型,您可以將一些字符串到數字的將其原始表示轉換爲數字:

create or replace function string_to_number(p_string varchar2) 
return number as 
    l_raw raw(40); 
    l_number number; 
begin 
    l_raw := utl_i18n.string_to_raw(data => p_string, dst_charset => 'AL32UTF8'); 
    l_number := to_number(rawtohex(l_raw), 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); 
    return l_number; 
end; 
/

,然後再返回:

create or replace function number_to_string(p_number number) 
return varchar2 as 
    l_raw raw(40); 
    l_string varchar2(20); 
begin 
    l_raw := hextoraw(to_char(p_number, 'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')); 
    l_string := utl_i18n.raw_to_char(data => l_raw, src_charset => 'AL32UTF8'); 
    return l_string; 
end; 
/

正如你可以使用:

insert into test (no) values (string_to_number('Puneet_kushwah1')); 

1 row inserted. 

select * from test; 

            NO 
--------------------------------------- 
    417765537084927079232028220523112497 

select number_to_string(no) from test; 

NUMBER_TO_STRING(NO)               
-------------------------------------------------------------------------------- 
Puneet_kushwah1                 

你並不真正需要的功能,你可以做轉換在線;但是這會讓事情變得更加清晰。

但是你受限於數字類型的精度。我認爲你只能使用大約20個字符,但它取決於實際的字符串和它的十六進制表示。

(我不認可這種做法,它只是一個溫和的有趣的問題)。

相關問題