2012-02-10 19 views
30

में संख्यात्मक कॉलम की सटीकता बदलना वर्तमान में मेरे पास एक स्तंभ है जिसे NUMBER के रूप में घोषित किया गया है। मैं कॉलम की परिशुद्धता को NUMBER (14,2) में बदलना चाहता हूं।ओरेकल

तो, मैं जिसके लिए

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2)' 

आदेश भाग गया, मैं एक त्रुटि मिली:

column to be modified must be empty to decrease precision or scale 

मैं इसे, जबकि यह परिशुद्धता बदलता है और मैं डॉन स्तंभ रिक्त होना चाहता है अनुमान लगा रहा हूँ यह नहीं पता कि यह क्यों कहता है कि हम इसे कम करना चाहते हैं, जबकि हम इसे बढ़ा रहे हैं, कॉलम में डेटा खोया नहीं जा सकता है। क्या इसके लिए कोई छोटा कामकाज है? मैं इसे किसी अन्य तालिका में कॉपी नहीं करना चाहता हूं और इसे बाद में छोड़ना चाहता हूं, या कॉलम का नाम बदल सकता हूं और कॉलम के बीच कॉपी कर सकता हूं, क्योंकि स्थानान्तरण और बूंदों के बीच डेटा खोने का जोखिम होता है।

उत्तर

59

मान लीजिए कि आपने शुरुआत में सटीकता निर्धारित नहीं की है, यह अधिकतम (38) माना जाता है। आप सटीक है क्योंकि आप 14.

इस स्तंभ का नाम बदलने का है संभाल करने के लिए सबसे आसान तरीका करने के लिए 38 से बदल रहे हैं को कम करने कर रहे हैं, अधिक डेटा की प्रतिलिपि, मूल स्तंभ तो ड्रॉप:

alter table EVAPP_FEES rename column AMOUNT to AMOUNT_OLD; 

alter table EVAPP_FEES add AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_OLD; 

alter table EVAPP_FEES drop column AMOUNT_OLD; 

तुम सच में स्तंभ आदेश बनाए रखना चाहते हैं, तो आप दो बार के बजाय डेटा को स्थानांतरित कर सकते हैं: तालिका संकुचित है

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2); 

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT; 

update EVAPP_FEES set AMOUNT = null; 

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP; 

alter table EVAPP_FEES drop column AMOUNT_TEMP; 
+1

इन समाधानों के बीच क्या अंतर है? – BrownFurSeal

+4

@ ब्रौनफुरसेल: पहला समाधान बदले गए कॉलम को ले जाएगा, ताकि यह तालिका में अंतिम कॉलम बन जाए। दूसरा समाधान कॉलम के मूल क्रम को सुरक्षित रखेगा। – Allan

+0

पहली विधि कॉलम को नष्ट कर देती है (यदि स्तंभ कहीं भी उपयोग किया जाता है तो समस्याएं पैदा हो सकती हैं)। दूसरी विधि गैर-विनाशकारी है लेकिन कॉलम को निरर्थक होने की आवश्यकता है। यदि यह गैर-शून्य है, तो इसे कम करने के लिए आपको कमांड जोड़ने की आवश्यकता होगी, फिर परिवर्तन के बाद इसे गैर-शून्य करने के लिए पुनर्स्थापित करें। – ADTC

1

स्केल सेट करके, आप परिशुद्धता को कम करते हैं। NUMBER (16,2) आज़माएं।

+0

मैंने प्रत्येक नंबर को 1 से 38 तक करने की कोशिश की और अभी भी वही त्रुटि प्राप्त हुई। – roymustang86

+0

क्षमा करें मैं पोस्ट को गलत तरीके से पढ़ता हूं। जब आप NUMBER के साथ एक कॉलम परिभाषित करते हैं, तो यह अधिकतम 38 का मान निर्दिष्ट करता है, इसलिए किसी भी पैमाने पर डेटा खोने की संभावना के साथ सटीकता कम हो जाएगी। आपको क्यों लगता है कि आप एक नई टेबल बनाकर और पुराने से डेटा कॉपी करके कुछ डेटा खो सकते हैं? –

+0

हजारों रिकॉर्ड हैं, और यदि अद्यतन/परिवर्तन कथन में से कोई एक विफल रहता है, तो इसे – roymustang86

0

अगर यह काम करेगा:

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2); 

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT; 

update EVAPP_FEES set AMOUNT = null; 

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP; 

alter table EVAPP_FEES move nocompress; 

alter table EVAPP_FEES drop column AMOUNT_TEMP; 

alter table EVAPP_FEES compress;