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