Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

TO_char किसी संख्या को स्ट्रिंग में बदलने के बाद स्लैश मान लौटाता है

ऐसा लगता है कि आपने अपनी तालिका में डेटा दूषित कर दिया है। यह वहां कैसे पहुंचा, और आप इसके बारे में क्या कर सकते हैं, सहित कुछ सवालों की ओर जाता है?

दूषित संख्यात्मक (या तिथि ) मान अक्सर ओसीआई कार्यक्रमों से आते हैं, लेकिन कुछ बग रिपोर्टें हैं जो सुझाव देती हैं कि imp भ्रष्टाचार के लिए जाना जाता है। आंतरिक प्रतिनिधित्व को समर्थन नोट 1007641.6 में प्रलेखित किया गया है, लेकिन मुझे यह स्पष्टीकरण समस्याओं को फिर से बनाते समय काम करना आसान हो जाता है, और 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

मुझे ठीक से पता नहीं चला कि आपकी तालिका में आपके क्या मूल्य हैं, लेकिन मैं एक समान परिणाम दिखा सकता हूं:

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;
/

मूल्यों को डंप करने से पता चलता है कि वे थोड़े अजीब दिखते हैं:

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      

इसके विरुद्ध अपना स्वरूपण चलाने से समान परिणाम मिलते हैं:

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/

यदि आप dump() जोड़ सकते हैं प्रश्न के लिए अपने स्वयं के डेटा के लिए आउटपुट तो मैं देख सकता हूं कि क्या मैं वास्तव में आपके द्वारा देखे जा रहे मूल्यों को फिर से बना सकता हूं।

अनजाने में, डेटा को अपडेट करके इसे 'सही' करना संभव हो सकता है, जैसे:

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                                 

हालांकि, आपको यह पूछना होगा कि वास्तविक सही मूल्य क्या है, जो संभवत:वापस कैसे/क्यों/कब दूषित हो गया था। मैं इस डेटा को छूने से बहुत सावधान रहूंगा यदि यह बिल्कुल भी महत्वपूर्ण है, और वास्तव में इसे हल करने के लिए Oracle सपोर्ट को शामिल करने के लिए @DazzaL की सलाह को मानना ​​होगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle से जुड़ना:CodeIgniter बनाम Laravel

  2. मैं किसी अन्य चुनिंदा क्वेरी के परिणाम की 10वीं, 20वीं, 30वीं ... पंक्ति का चयन कैसे कर सकता हूं?

  3. CEIL () Oracle में फंक्शन

  4. Oracle क्लाउड के लिए MAA प्रलेखन

  5. ओरेकल पदानुक्रमित क्वेरी शामिल होने से खंड शुरू करें