2012-02-27 20 views
6

जाओ उपरोक्त त्रुटि जब तत्काल अमल एक पाशORA-01,747: अवैध user.table.column, table.column, या स्तंभ विनिर्देश

Update CustomersPriceGroups set 1AO00=:disc Where cuno=:cuno 
    Parameters: disc=66 cuno=000974 
Update CustomersPriceGroups set 1AP00=:disc Where cuno=:cuno 
    Parameters: disc=70.5 cuno=000974 
Update CustomersPriceGroups set 1AQ00=:disc Where cuno=:cuno 
    Parameters: disc=66 cuno=000974 
Update CustomersPriceGroups set 1ZA00=:disc Where cuno=:cuno 
    Parameters: disc=60 cuno=000974 

में कहा जाता है इसका क्या मतलब है?

यहाँ कोड टुकड़ा

c:=PriceWorx.frcPriceListCustomers('020','221'); 
LOOP 
    fetch c into comno,cuno,nama,cpls; 
    exit when c%notfound; 
    dbms_output.put_Line(cuno); 
    g:=priceWorx.frcPriceListItemGroups('020','221'); 
    d:=priceworx.frcCustomerDiscounts('020','221',cuno); 
    loop 
    fetch g into comno,cpgs,n; 
    fetch d into comno,cpls,cuno,cpgs,stdt,tdat,qanp,disc,src; 
    --dbms_output.put(chr(9)||cpgs); 
    sQ:='Update saap.CustomersPriceGroups set "'|| trim(cpgs)||'"=:disc ' 
     || ' Where cuno=:cuno'; 
    execute immediate sQ using disc,cuno; 
    commit; 
    dbms_output.put_line(sQ); 
    dbms_output.put_line(chr(9)||'Parameters: disc='|| disc||' cuno='||cuno); 
    exit when g%notfound; 
    end loop; 
    close g; 
    close d; 
end loop; 

उत्तर

4

अनगिनत पहचानकर्ताओं को वर्णमाला वर्ण से शुरू होना चाहिए (rule 6 here देखें)। आप CustomersPriceGroups के लिए तालिका परिभाषा को देखकर अगर यह उन नामों वाले स्तंभ हैं हम नहीं जानते कि बिना एक नाम एक नंबर 1AO00, 1AP00 आदि

के साथ शुरू के साथ एक स्तंभ के लिए एक मूल्य असाइन करने की कोशिश कर रहे हैं। यदि ऐसा होता है तो उन्हें उद्धृत पहचानकर्ता के रूप में बनाया जाना चाहिए। यदि ऐसा है तो आपको उन्हें उद्धरण के साथ (हर जगह) संदर्भित करना होगा, जो आदर्श नहीं है - कोड को पढ़ने में थोड़ा मुश्किल बनाता है, इस तरह की गलती करना आसान बनाता है, और यह गलत हो सकता है कि क्या गलत है। यहां तक ​​कि ओरेकल, का कहना है कि एक ही पृष्ठ पर:

नोट: Oracle डाटाबेस वस्तु नाम के लिए उद्धृत पहचानकर्ता का उपयोग कर की सिफारिश नहीं करता। इन उद्धृत पहचानकर्ताओं को एसक्यूएल * प्लस द्वारा स्वीकार किया जाता है, लेकिन डेटाबेस ऑब्जेक्ट्स प्रबंधित करने वाले अन्य टूल्स का उपयोग करते समय वे वैध नहीं हो सकते हैं।

आपके कोड में आप sQ असाइन करते समय उद्धरणों का उपयोग करते हुए प्रतीत होते हैं, लेकिन आपके द्वारा दिखाए जाने वाले आउटपुट में नहीं है; लेकिन इसमें saap. स्कीमा पहचानकर्ता नहीं है। ऐसा इसलिए हो सकता है क्योंकि आप जो कोड सोचते हैं उसका संस्करण नहीं चला रहे हैं, लेकिन हो सकता है कि आप खो गए हों, यदि आपने इसे चिपकाने के बजाय डेटा को फिर से टाइप किया है - तो आप c.cuno के पहले आउटपुट को नहीं दिखा रहे हैं। लेकिन यह भी संभव है कि कॉलम नाम गलत है, कहें।

यदि execute त्रुटि फेंक रहा है, तो आपको उस समय लूप के आसपास निष्पादित आदेश दिखाई नहीं देगा क्योंकि डीबग इसके बाद आता है - आप सफल मान देख रहे हैं, जो तोड़ने वाला नहीं है। आपको कार्यों द्वारा लौटाए गए सभी मूल्यों की जांच करने की आवश्यकता है; मुझे संदेह है कि gcpgs के लिए एक मान लौटा रहा है जो वास्तव में मान्य कॉलम नाम नहीं है।

जैसा कि @ninesided कहते हैं, अधिक जानकारी, विशेष रूप से पूर्ण अपवाद संदेश दिखाते हुए, यह पहचानने में सहायता करेगा कि क्या गलत है।

6

इसका मतलब है कि ओरेकल पार्सर का मानना ​​है कि कि आपके स्तंभों में से एक मान्य नहीं है है। ऐसा इसलिए हो सकता है क्योंकि आपने गलत तरीके से एक कॉलम का संदर्भ दिया है, कॉलम नाम आरक्षित शब्द है, या क्योंकि आपके पास UPDATE कथन में एक वाक्यविन्यास त्रुटि है जो ओरेकल को लगता है कि कुछ जो कॉलम नहीं है, एक कॉलम है। यह वास्तव में पूरा कथन देखने में मदद करेगा, जिसे CustomersPriceGroups तालिका की परिभाषा और अपवाद का पूरा पाठ उठाया जा रहा है, क्योंकि यह अक्सर बताएगा जो कॉलम गलती है।

+1

मेरे मामले में, मेरे पास एक 'डालने' कथन में पिछला कॉमा था। –

+1

मेरे मामले में कॉलम नाम आरक्षित शब्द था। – Chirag

+0

बढ़िया कैसे ये सभी अलग-अलग समस्याएं एक ही त्रुटि संदेश बनाती हैं। ऐसा नहीं है कि पार्सर को पता नहीं था कि क्या गलत हुआ (जिस पर अगर चेक-शाखा), इंजीनियरों को अधिक विशिष्ट त्रुटि संदेश बनाने के लिए बहुत आलसी थे। – masterxilo

17

डबल कॉमा के लिए अपनी क्वेरी जांचें।

insert into TABLE_NAME (COLUMN1, COLUMN2,,COLUMN3) values(1,2,3); 

(COLUMN2 के बाद अतिरिक्त कॉमा है)।


अपडेट: हाल ही में (कुछ लोगों को विशेष प्रतिभा है) मैं नए दृष्टिकोण के साथ एक ही अपवाद प्राप्त करने के लिए सफल होने: में उद्धृत कारणों की

update TABLE_NAME set COLUMN1=7, set COLUMN2=8 

(दूसरे सेट अनावश्यक है)

+0

कम से कम दो या दो से अधिक पंक्तियों के साथ अपना उत्तर समझाएं । बेहतर समझने के लिए। – Hamad

+0

धन्यवाद। मैंने पहली बंद ब्रेस से पहले एक अतिरिक्त कॉमा रखा था)। ओरेकल अच्छा त्रुटि संदेश देने से परेशान नहीं लगता है। – masterxilo

1

इसके अलावा यहां अन्य उत्तरों, आपको यह भी जांचने की आवश्यकता हो सकती है कि आपके किसी भी तालिका कॉलम नाम का कोई नाम नहीं है जिसे ओरेकल डेटाबेस में एक विशेष/आरक्षित शब्द माना जाता है।

मेरे मामले में मेरे पास टेबल कॉलम नाम यूआईडी था। यूआईडी ओरेकल में एक आरक्षित शब्द है और इसलिए मुझे यह त्रुटि मिल रही थी।

सौभाग्य से, मेरी तालिका एक नई तालिका थी और मेरे पास इसमें कोई डेटा नहीं था। मैं टेबल को हटाने और समस्या कॉलम के लिए एक संशोधित नाम के साथ एक नया निर्माण करने के लिए ऑरैक DROP तालिका कमांड का उपयोग करने में सक्षम था।

मुझे समस्या कॉलम का नाम बदलने में भी परेशानी थी क्योंकि ऑरैकल मुझे नहीं जाने देगा और त्रुटियों को फेंक देगा।

0

यदि आप एक सिंटैक्स त्रुटि के बजाय सेट बयान के अंत में एक अतिरिक्त "" जोड़ने के लिए, आप ORA-01,747, जो बहुत बहुत ओरेकल जैसे

update table1 
    set col1 = 'Y', --this odd 1 
    where col2 = 123 
    and col3 = 456 
0

कारण से अजीब है मिल जाएगा उदाहरण के लिए चयन के मुकाबले कॉलम के एक अलग सेट द्वारा समूहबद्ध किया जा सकता है:

select tab.a, tab.b, count(*) 
from ... 
where... 
group by tab.a, tab.c; 
0

और मैं क्वेरी लिख रहा था। मैं [ और ]

UPDATE SN.TableName 
SET [EXPIRY_DATE] = systimestamp + INTERVAL '12' HOUR, 
WHERE [USER_ID] ='12345' 

हमने हाल ही में ओरेकल के लिए एसक्यूएल सर्वर से चले गए दूर करने के लिए किया था।