2013-01-11 3 views
3

데이터베이스 열 amount [Data type Number(32,12)]이 있습니다. amount 필드에서 to_char을 사용하면 출력에 슬래시 값이 추가됩니다. 내가 직접 금액 필드에 저장된 값을 사용하는 경우숫자를 문자열로 변환 한 후 슬래시 값을 반환하는 TO_char

Screenshot

, 내가 올바른 값을 얻고있다

select TO_Char(0.000000000099,'FM99999999999999999999999999999990.099999999999') from dual;

출력 : - 당신이 좋아 0.000000000099

+0

실제로 추가 되었습니까? 아니면 GUI가 재생되고 있습니까? your_table'에서 ascii (substr (to_char (your_column, '<형식 모델>'), -1)을 선택할 수 있습니까? 숫자 인 경우 48-57 범위에 있어야합니다. – Ben

+0

GUI 때문이 아닙니다. 값이/& #로보기에 저장됩니다. 위 쿼리의 출력 결과는 47입니다. 범위는 48-57입니까? – user1501147

+0

0-9 [ASCII] (http://www.asciitable.com/)의 값이지만 대부분의 서양 문자 집합에 대해서는 상당히 일반적입니다. 47은'/'이므로 하나를 추가하면 ... – Ben

답변

2

같습니다 테이블의 데이터가 손상되었습니다. 어떤 방법으로 거기에 도달했는지, 그리고 어떻게 할 수 있습니까?

부패 숫자 (또는 date) 값은 종종 OCI 프로그램에서 가져 오지만, imp이 손상을 일으키는 것으로 알려진 버그 보고서가 있습니다. 내부 표현은 지원 정보 1007641.6에 문서화되어 있지만, 문제를 재현 할 때 this explanation을 사용하는 것이 더 쉽고 OCI 프로그램 대신 PL/SQL 블록을 사용할 수 있습니다.

두 숫자는이 같은 내부적으로 표현되어야 문제가 발생하는 : 당신이 테이블에있는 값을 정확히 파악하지 않은

select dump(0.000000000099, 16) as d1, 
    dump(0.000000001680, 16) as d2 
from dual; 

D1     D2 
------------------ --------------------- 
Typ=2 Len=2: bb,64 Typ=2 Len=3: bc,11,51 

을,하지만 난 비슷한 결과를 표시 할 수 있습니다 :

column d1 format a25 
column d2 format a25 
select amount, dump(amount) d1, dump(amount, 16) d2 
from t42; 

        AMOUNT D1      D2      
--------------------------- ------------------------- ------------------------- 
       0.00000000010 Typ=2 Len=2: 187,101  Typ=2 Len=2: bb,65   
      0.000000001499 Typ=2 Len=3: 188,16,0  Typ=2 Len=3: bc,10,0  

실행 : 값을 덤프

create table t42 (amount number(32,12)) nologging; 

declare 
    n number; 
begin 
    dbms_stats.convert_raw_value('bb65', n); 
    insert into t42 (amount) values (n); 
    dbms_stats.convert_raw_value('bc100000', n); 
    insert into t42 (amount) values (n); 
end; 
/

은 이상한 약간의 모양을 보여줍니다 당신은 내가 당신이보고있는 정확하게 값을 다시 만들 수 있다면 내가 볼 수있는 질문에 자신의 데이터에 대한 dump() 출력을 추가 할 수 있습니다

select amount as actual__________amount, 
    TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999') 
     as amount__________Changed 
from t42 
order by amount;  

    ACTUAL__________AMOUNT AMOUNT__________CHANGED      
--------------------------- ---------------------------------------------- 
       0.00000000010 ############################################## 
      0.000000001499 0.00000000150/ 

: 그에 대한 당신의 형식이 유사한 결과를 제공합니다.

update t42 set amount = amount * 1; 

select amount, dump(amount) d1, dump(amount, 16) d2 
from t42; 

        AMOUNT D1      D2      
--------------------------- ------------------------- ------------------------- 
       0.0000000001 Typ=2 Len=2: 188,2  Typ=2 Len=2: bc,2   
      0.000000001499 Typ=2 Len=3: 188,15,100 Typ=2 Len=3: bc,f,64 

select amount as actual__________amount, 
    TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999') 
     as amount__________Changed 
from t42 
order by amount; 

    ACTUAL__________AMOUNT AMOUNT__________CHANGED      
--------------------------- ---------------------------------------------- 
       0.0000000001 0.0000000001         
      0.000000001499 0.000000001499         

는 그러나 실제 정확한 값은 아마 어떻게/왜 다시 오는, 무엇인지 물어 봐야 :

일화, 데이터, 예를 업데이트하여이 '올바른'을 할 수 있습니다/그것이 손상되었을 때. 이 데이터가 중요하다면 나는이 데이터를 만지는 것에 매우 조심 스러울 것이며, 은 오라클 지원이 그것을 소트하기 위해 관련된 DazzaL의 조언을 두 번째로 가져야 만한다.

+0

질문이 하나 더 있습니다. "일부 버그 보고서에 따르면 imp가 부패를 일으키는 것으로 알려져 있습니다." 이 꼬마 도깨비는 무엇입니까 ??? – user1501147

+0

@ user1501147 - 'imp'는 이전 [가져 오기 도구]입니다 (http://docs.oracle.com/cd/E11882_01/server.112/e22490/original_import.htm). 새로운 ['impdp'] (http://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_import.htm)에도 문제가 있는지 확실하지 않습니다. 오라클 지원 사이트에서'imp'에 대한 언급을 보았습니다. 그것은 부패가 발생했을 수도있는 한 가지 방법 일뿐입니다. 데이터가 다른 데이터베이스에서 이전되지 않은 경우 'imp'는 관련이 없으며 다른 원인이 있습니다. –

+1

나는 이것이 @alex :-)의 첫 번째 문장에서 당신이라는 것을 알았다. – Ben