SQL त्रुटि "ORA-01722: अमान्य संख्या"


101

किसी के लिए एक बहुत ही आसान, निम्नलिखित प्रविष्टि मुझे दे रही है

ORA-01722: अमान्य संख्या

क्यों?

INSERT INTO CUSTOMER VALUES (1,'MALADY','Claire','27 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (2,'GIBSON','Jake','27 Smith St Caulfield','0415 713 598');
INSERT INTO CUSTOMER VALUES (3,'LUU','Barry','5  Jones St Malvern','0413 591 341');
INSERT INTO CUSTOMER VALUES (4,'JONES','Michael','7  Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (5,'MALADY','Betty','27 Smith St Knox','0418 418 347');

28
तो ... तालिका की परिभाषा क्या है CUSTOMER? आपने केवल आधी जानकारी दी है।
ग्रेग हेविगिल

3
टेलीफोन नंबर ही एक ऐसी चीज है जो संभवतः एक संख्यात्मक के रूप में परिभाषित की जा सकती है, जो आपके डेटा को एक संख्यात्मक (रिक्त स्थान संख्यात्मक नहीं हैं) के रूप में प्रतिनिधित्व नहीं करता है। तो: अपनी तालिका परिभाषा की जाँच करें और अपने इनपुट विवरणों के साथ तुलना करें।
एपीसी

10
लोग इस प्रश्न को क्यों वोट देंगे। डेटाबेस में नए लोगों के लिए, यह एक अजीब त्रुटि है। मैं देख सकता हूं कि उद्धरणों के साथ मूल्यों को कैसे संलग्न किया जा सकता है, यह ऐसा लगता है जैसे यह एक स्ट्रिंग है। यह सिर्फ इस बात पर निर्भर करता है कि डेटाबेस क्या है। यह सभी तार या संख्या हो सकती है जो सिर्फ खेतों पर निर्भर करती है। जब डेटाबेस बनाया गया था तो शायद यह एक त्रुटि थी।
sisharp

एक उदाहरण जहां उपरोक्त स्थिति आती है: तालिका 1 में डालें (रोलनंबर) मान ('123'); जहाँ RollNumber "संख्या" प्रकार का एक कॉलम है।
इशानी गुप्ता

3
"वापस o`twelve में, मैं एक किताब टांड़ खींचा, और एक Oracle सवाल का जवाब में 'ढेर मैं अभी भी निपुण हूँ, ऊपर ज्ञान के साथ मैं रखा है, लेकिन मैं अभी भी एक नहीं है। स्वीकार करते हैं। "
हारून

जवाबों:


121

ORA-01722 त्रुटि तब होती है जब वर्ण स्ट्रिंग को संख्या में परिवर्तित करने का प्रयास किया जाता है, और स्ट्रिंग को संख्या में परिवर्तित नहीं किया जा सकता है।

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


2
यह भी ध्यान दें कि "(अशक्त)" के साथ मैन्युअल रूप से एक फ़ील्ड को पूरा करें जो आपको त्रुटि देगा। यदि डिफॉल अशक्त है और आप इसे पूरा नहीं करते हैं तो यह (नल) ऑटो-कम्प्लीट हो जाएगा लेकिन जब आप इसे टाइप करेंगे तो यह समान नहीं है।
bogdan.rusu

एह, "स्ट्रिंग को संख्या में नहीं बदला जा सकता है" - यह बात नहीं है। स्ट्रिंग को संख्या में परिवर्तित किया जा सकता है। यहां बिंदु एक संख्या का विपरीत रूपांतरण एक स्ट्रिंग कॉलम के लिए है, लेकिन ओरेकल स्वचालित रूप से ऐसा नहीं करता है: आपको इसे स्वयं स्ट्रिंग करना होगा, अपने SQL अभिव्यक्ति में मूल्य को स्पष्ट रूप से चिह्नित करना होगा, इसे '' या '' से घेरना होगा। ।
फ्रांता

25

मान लीजिए कि टेलीफोन नंबर को परिभाषित किया गया है NUMBERतो रिक्त स्थान को संख्या में परिवर्तित नहीं किया जा सकता है:

create table telephone_number (tel_number number);
insert into telephone_number values ('0419 853 694');

उपरोक्त आपको ए

ORA-01722: अमान्य संख्या


16

इसे हल करने का एक तरीका यहां दिया गया है। गैर-संख्यात्मक वर्णों को निकालें फिर इसे एक संख्या के रूप में डालें।

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)

6
ऐसा करने से अग्रणी 0.
जो C

2
यदि आप '0419 853 694' जैसे मूल्यों को संग्रहीत करना चाहते हैं, तो मूल ओपी - आपका टेबल कॉलम कैंट प्रकार का "नंबर" हो जाता है क्योंकि नंबर में अग्रणी शून्य नहीं हो सकते। मेरे मामले में हालांकि यह सिर्फ मैं क्या जरूरत है, ty gmlacrosse!
हिपोकिटो

10

जैसा कि यह त्रुटि तब आती है जब आप db में नॉन-न्यूमेरिक वैल्यू को एक न्यूमेरिक कॉलम में डालने की कोशिश कर रहे हैं, ऐसा लगता है कि आपका अंतिम क्षेत्र न्यूमेरिक हो सकता है और आप इसे डेटाबेस में एक स्ट्रिंग के रूप में भेजने की कोशिश कर रहे हैं। अपना अंतिम मान जांचें।


8

वैसे यह भी हो सकता है:

SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 
FROM table t;

जहां संधि में स्थानापन्न के लिए ऑपरेटर का उपयोग ||नहीं किया जाता है +

इस मामले में आपको मिलता है: ORA-01722: invalid number ...


1
यह अच्छा है। एक और जहरीली नियति यह हो सकती है। आपने एक फ़ील्ड में चयन फ़ील्ड में टिप्पणी की जैसे - t.fieldname। बाद में आप उस लाइन स्टार्ट टिप्पणी को हटाने का इरादा रखते हैं, लेकिन एक टिप्पणी वाला चरित्र दुर्घटना से बचा हुआ है। इस प्रकार है: - t.fieldname। मेरे साथ यह तब हुआ, जब मैं एक बहुत बड़ी क्वेरी पर काम कर रहा था, जहाँ मुझे जानवरों को पुनर्गठित करते हुए, सैकड़ों कॉलुम्स पर टिप्पणी / अनकम्फर्ट करना है।
ओलेपुनर

8

यह है क्योंकि:

आपने एक SQL कथन निष्पादित किया है जो एक स्ट्रिंग को एक संख्या में बदलने की कोशिश करता है, लेकिन यह असफल था।

जैसा कि समझाया गया है:

इस त्रुटि को हल करने के लिए:

केवल संख्यात्मक क्षेत्र या वर्ण फ़ील्ड जिसमें संख्यात्मक मान होते हैं, का उपयोग अंकगणितीय कार्यों में किया जा सकता है। सुनिश्चित करें कि सभी भाव संख्याओं का मूल्यांकन करते हैं।


4

स्ट्रिंग कॉलम मूल्यों के लिए ओरेकल स्वचालित String2number रूपांतरण करता है ! हालाँकि, SQL में शाब्दिक तुलना के लिए, इनपुट को स्ट्रिंग के रूप में स्पष्ट रूप से सीमांकित किया जाना चाहिए: विपरीत रूपांतरण संख्या 2String स्वचालित रूप से नहीं किया जाता है, SQL- क्वेरी स्तर पर नहीं।

मेरे पास यह प्रश्न था:

select max(acc_num) from ACCOUNTS where acc_num between 1001000 and 1001999;

कि एक समस्या प्रस्तुत की: Error: ORA-01722: invalid number

मैंने अभी "संख्यात्मक" मानों को घेर लिया है , उन्हें 'स्ट्रिंग्स' बनाने के लिए, बस उन्हें स्पष्ट रूप से सीमांकित किया गया है :

select max(acc_num) from ACCOUNTS where acc_num between '1001000' and '1001999';

... और voilà: यह अपेक्षित परिणाम देता है।

संपादित करें: और वास्तव में: acc_numमेरी तालिका में कर्नल को परिभाषित किया गया है String। हालांकि संख्यात्मक नहीं, invalid numberरिपोर्ट किया गया था। और स्ट्रिंग-संख्याओं के स्पष्ट परिसीमन ने समस्या को हल कर दिया।

दूसरी ओर, ओरेकल स्ट्रिंग्स को संख्याओं के रूप में मान सकता है । अतः संख्यात्मक कार्यों / कार्यों को स्ट्रिंग्स पर लागू किया जा सकता है, और ये प्रश्न काम करते हैं:

टेबल से अधिकतम (string_column) चुनें ;

TABLE से string_column चुनें जहां '2' और 'z' के बीच string_column ;

TABLE से string_column चुनें जहां string_column > '1';

TABLE से string_column चुनें जहां string_column <= 'b';


मुझे एक समान स्थिति का सामना करना पड़ा। ora-01722 अमान्य-संख्या को एक चयन कथन पर ट्रिगर किया गया था, न कि सम्मिलित विवरण। मैंने तालिका की परिभाषा जाँची और पाया कि स्तंभ संख्या के बजाय एक चरचर था, इसलिए मैंने संख्या के चारों ओर एकल उद्धरण जोड़े
न्यूटन के प्रशंसक 01

2

मेरे मामले में रूपांतरण त्रुटि कार्यात्मक आधारित सूचकांक में थी , जिसे मैंने तालिका के लिए बनाया था।

डाला जा रहा डेटा ठीक था। मुझे यह पता लगाने में थोड़ा समय लगा कि वास्तविक त्रुटि बग्गी इंडेक्स से आई है।

अच्छा होगा, अगर ओरेकल इस मामले में अधिक सटीक त्रुटि संदेश दे सकता था।


1

यदि आप एक insert into...select * from...बयान करते हैं, तो 'अमान्य संख्या' त्रुटि को भी प्राप्त करना आसान है।

मान लें कि आपके पास एक तालिका FUND_ACCOUNTहै, जिसमें दो कॉलम हैं:

AID_YEAR  char(4)
OFFICE_ID char(5)

और मान लें कि आप OFFICE_ID को सांख्यिक रूप से संशोधित करना चाहते हैं, लेकिन तालिका में मौजूदा पंक्तियाँ हैं, और इससे भी बदतर, उन पंक्तियों में से कुछ में OFFICE_ID मान '' (रिक्त) है। ओरेकल में, आप किसी स्तंभ के डेटाटाइप को संशोधित नहीं कर सकते हैं यदि तालिका में डेटा है, और इसे एक '' को 0. में बदलने के लिए थोड़ी सी प्रवंचना की आवश्यकता है तो यहां यह करने का तरीका है:

  1. डुप्लिकेट तालिका बनाएँ: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. मूल तालिका से सभी पंक्तियों को हटा दें: DELETE FROM FUND_ACCOUNT;
  3. मूल तालिका में कोई डेटा न होने पर, उसके OFFICE_ID कॉलम के डेटा प्रकार में परिवर्तन करें: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. लेकिन फिर यहाँ मुश्किल हिस्सा है। क्योंकि कुछ पंक्तियों में रिक्त OFFICE_ID मान होते हैं, यदि आप एक सरल करते हैं INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, तो आपको "ORA-01722 अमान्य संख्या" त्रुटि मिलेगी। '' (रिक्त) OFFICE_ID को 0 में बदलने के लिए, आपके सम्मिलित विवरण को इस तरह देखना होगा:

INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;


यह एक ऐसे मामले का एक बहुत ही जटिल उदाहरण है जहाँ त्रुटि उत्पन्न हो सकती है + एक स्पष्टीकरण उस विशिष्ट मामले को कैसे हल किया जाए, जो कि लागू नहीं हो सकता है।
Jan Doggen

0

यह मेरे साथ भी हुआ, लेकिन समस्या वास्तव में अलग थी: फ़ाइल एन्कोडिंग

फ़ाइल सही थी, लेकिन फ़ाइल एन्कोडिंग गलत थी। यह SQL सर्वर के निर्यात उपयोगिता द्वारा उत्पन्न किया गया था और मैंने इसे यूनिकोड के रूप में सहेजा था।

टेक्स्ट एडिटर में फ़ाइल अपने आप अच्छी लगती है, लेकिन जब मैंने *.badएसक्यूएल * लोडर से रिजेक्टेड लाइनों के साथ जनरेट की गई फाइल को खोला , तो मैंने देखा कि इसमें हर ओरिजिनल कैरेक्टर के बीच खराब कैरेक्टर थे। फिर मैं हालांकि एन्कोडिंग के बारे में।

मैंने नोटपैड ++ के साथ मूल फ़ाइल खोली और इसे एएनएसआई में बदल दिया, और सब कुछ ठीक से लोड किया।


-1

ORA-01722 त्रुटि बहुत सीधी है। टॉम Kyte के अनुसार :

हमने या तो खोजबीन करने का प्रयास किया है या फिर असमानता ने एक चरित्र स्ट्रिंग को एक संख्या में बदल दिया है और यह विफल हो रहा है।

हालांकि, जहां समस्या अक्सर पहली बार में स्पष्ट नहीं होती है। इस पृष्ठ ने मुझे अपनी समस्या का निवारण, खोज और ठीक करने में मदद की। संकेत: उन स्थानों की तलाश करें जहां आप स्पष्ट रूप से या अंतर्निहित रूप से एक स्ट्रिंग को एक संख्या में परिवर्तित कर रहे हैं। (मैं NVL(number_field, 'string')अपने कोड में था ।)


-1

जब भी आपके पास कोई अमान्य संख्या त्रुटि हो, तो यह प्रयास करें

इसमें a.emplid नंबर है और b.emplid एक varchar2 है, इसलिए यदि आपको किसी एक पक्ष को बदलना है

कहाँ to_char (a.emplid) = b.emplid


-4

आप इस त्रुटि को दूर करने के लिए हमेशा TO_NUMBER () फ़ंक्शन का उपयोग कर सकते हैं। इसे INSERT INTO कर्मचारियों के फोन_नंबर मान (TO_NUMBER ('0419 853 694') के रूप में शामिल किया जा सकता है;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.