SQL hatası "ORA-01722: geçersiz numara"


101

Birisi için çok kolay olan aşağıdaki ek bana

ORA-01722: geçersiz numara

neden?

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
Peki ... tablo tanımı ne için CUSTOMER? Gerekli bilginin sadece yarısını verdin.
Greg Hewgill

3
Telefon numaraları, verilerinizin sayısal olarak temsil etmediği bir sayısal olarak tanımlanabilecek tek şeydir (boşluklar sayısal değildir). Yani: tablo tanımınızı kontrol edin ve girdi ifadelerinizle karşılaştırın.
APC

10
İnsanlar neden bu soruya olumsuz oy versin? Veritabanlarında yeni olan insanlar için bu tuhaf bir hatadır. Değerleri tırnak içine almanın nasıl bir dizge gibi görünmesini sağlayabileceğini görebiliyorum. Veritabanının nasıl kurulduğuna bağlıdır. Hepsi dizeler veya sayılar olabilir, sadece alanlara bağlıdır. Belki de veritabanı oluşturulurken bir hataydı.
sisharp

Yukarıdaki durumun ortaya çıktığı bir Örnek: table_1 (rollNumber) değerlerine ('123') ekleyin; rollNumber, "sayı" türünde bir sütundur.
Ishani Gupta

3
"O`twelve geri döndüğümde, raftan bir kitap çıkardım ve bir Oracle sorusunu cevapladım. 'Yığın'da hala ustayım, sakladığım bilgilerle doluyum, ancak hala bir kabulüm yok . "
Aaron

Yanıtlar:


121

Bir karakter dizesini sayıya dönüştürme girişiminde bulunulduğunda ve dizi bir sayıya dönüştürülemediğinde ORA-01722 hatası oluşur.

Tablo tanımınızı görmeden, değerler listenizin sonundaki sayısal diziyi bir sayıya dönüştürmeye çalışıyorsunuz gibi görünüyor ve onu sınırlayan boşluklar bu hatayı atıyor. Ancak bize verdiğiniz bilgilere göre, herhangi bir alanda (ilki dışında) olabilir.


2
Ayrıca bir alanı "(null)" ile manuel olarak doldurmanın size bu hatayı vereceğini unutmayın. Öntanımlı boş ise ve tamamlamazsanız, (null) ile otomatik olarak tamamlanır, ancak yazdığınızda aynı olmaz.
bogdan.rusu

Eh, "dizi bir sayıya dönüştürülemez" - Konu bu değil. Dize sayıya dönüştürülebilir. Buradaki nokta, bir sayının String sütununa zıt dönüştürülmesidir, ancak Oracle bunu otomatik olarak yapmaz: Bunu, SQL ifadenizdeki değeri açıkça işaretleyerek, onu "OR" "ile çevrelemek için bir String haline getirmeniz gerekir. .
Franta

25

Telefon numarasının, NUMBERboşlukların bir numaraya dönüştürülemeyeceği şekilde tanımlandığını varsayalım :

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

Yukarıdakiler size bir

ORA-01722: geçersiz numara


16

İşte bunu çözmenin bir yolu. Sayısal olmayan karakterleri kaldırın ve ardından sayı olarak çevirin.

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

6
Bunu yapmak
Joe C

2
bu orijinal OP'ye gider - '0419 853 694' gibi değerleri saklamak istiyorsanız tablo sütununuz "sayı" türünde olamaz çünkü sayının başında sıfır olamaz. benim durumumda ancak bu tam da ihtiyacım olan şey, ty gmlacrosse!
hipokito

10

Bu hata, db'deki sayısal bir sütuna sayısal olmayan bir değer eklemeye çalışırken ortaya çıktığı için, son alanınız sayısal olabilir ve bunu veritabanında bir dize olarak göndermeye çalışıyorsunuz. son değerinizi kontrol edin.


8

Aynı zamanda şunlar da olabilir:

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

nerede oracle Birleştirme için operatörü kullanılır ||değil +.

Bu durumda şunları elde edersiniz: ORA-01722: invalid number ...


1
Bu iyi bir tanesi. Bir başka zehirli kader de bu olabilir. Bir SELECT Alan Listesindeki bir alanı - t.fieldname gibi yorumladınız. Daha sonra bu satır başlangıcı açıklamasını kaldırmayı düşünürsünüz, ancak yorumlanmış bir karakter yanlışlıkla kalır. Böylece şunlar vardır: - t.fieldname. Bu, canavarı yeniden düzenlerken yüzlerce sütun yorum yapmam / yorum yapmam gereken çok büyük bir sorgu üzerinde çalışırken başıma geldi.
olippuner

8

Bunun nedeni ise:

Bir dizeyi sayıya dönüştürmeye çalışan bir SQL deyimi çalıştırdınız, ancak başarısız oldu.

Açıklandığı gibi:

Bu hatayı çözmek için:

Aritmetik işlemlerde yalnızca sayısal değerler içeren sayısal alanlar veya karakter alanları kullanılabilir. Tüm ifadelerin sayı olarak değerlendirildiğinden emin olun.


4

Oracle, String sütun değerleri için otomatik String2number dönüşümü yapar ! Bununla birlikte, SQL'deki metinsel karşılaştırmalar için, girdi açıkça bir Dize olarak sınırlandırılmalıdır: Ters dönüştürme number2String, SQL sorgusu düzeyinde değil, otomatik olarak gerçekleştirilmez.

Bu sorguyu aldım:

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

Bu bir sorun teşkil ediyordu: Error: ORA-01722: invalid number

"Sayısal" değerleri "Dizeler" yapmak için çevreledim , sadece onları açıkça sınırlandırdım :

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

... ve voilà: Beklenen sonucu döndürür.

düzenleme: Ve gerçekten: tablomdaki sütun acc_numolarak tanımlanmıştır String. Sayısal olmasa invalid numberda rapor edildi. Ve dizi numaralarının açıkça sınırlandırılması sorunu çözdü.

Öte yandan Oracle , Dizeleri sayı olarak ele alabilir . Böylece sayısal işlemler / işlevler Dizelere uygulanabilir ve bu sorgular çalışır:

TABLE'den max (string_column) seçin ;

TABLO gelen string_column seçmek burada string_column arasında ve 'z' '2';

TABLE'den string_column seçin, burada string_column > '1';

TABLE'den string_column seçin burada string_column <= 'b';


benzer bir durumla karşılaştım. ora-01722 geçersiz sayı, bir insert deyiminde değil, bir select deyiminde tetiklendi. Tablo tanımını kontrol ettim ve sütunun sayı yerine varchar olduğunu buldum, bu yüzden sayının etrafına tek tırnak işareti ekledim
Newton fan 01

2

Benim durumumda, dönüştürme hatası, tablo için oluşturduğum işlevsel tabanlı dizindeydi .

Eklenen veriler tamamdı. Gerçek hatanın buggy indeksinden geldiğini anlamam biraz zaman aldı.

Oracle bu durumda daha kesin hata mesajı verebilseydi iyi olurdu.


1

Bir ifade yaparsanız insert into...select * from..., 'Geçersiz Numara' hatasını almanız da kolaydır.

Diyelim ki FUND_ACCOUNTiki sütunu olan bir tablonuz var :

AID_YEAR  char(4)
OFFICE_ID char(5)

Ve diyelim ki OFFICE_ID'yi sayısal olacak şekilde değiştirmek istiyorsunuz, ancak tabloda mevcut satırlar var ve daha da kötüsü, bu satırlardan bazılarının OFFICE_ID değeri '' (boş) var. Oracle'da, tabloda veri varsa bir sütunun veri türünü değiştiremezsiniz ve a "'yı 0'a dönüştürmek biraz hile gerektirir. Yani bunu şu şekilde yapabilirsiniz:

  1. Yinelenen bir tablo oluşturun: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Orijinal tablodan tüm satırları silin: DELETE FROM FUND_ACCOUNT;
  3. Orijinal tabloda veri kalmadığında, OFFICE_ID sütununun veri türünü değiştirin: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. Ama sonra işte işin zor kısmı. Bazı satırlar boş OFFICE_ID değerleri içerdiğinden, basit bir işlem INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2yaparsanız, "ORA-01722 Geçersiz Sayı" hatası alırsınız. '' (Boş) OFFICE_ID'leri 0'lara dönüştürmek için, ekleme ifadenizin şöyle görünmesi gerekir:

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


Bu hata bir durumda çok karmaşık bir örnektir olabilir hiç geçerli olmayabilir bu özel durumda, çözmek için nasıl bir açıklama + oluşur.
Jan Doggen

0

Bu benim de başıma geldi, ancak sorun aslında farklıydı: dosya kodlaması .

Dosya doğruydu, ancak dosya kodlaması yanlıştı. SQL Server'ın dışa aktarma yardımcı programı tarafından oluşturuldu ve onu Unicode olarak kaydettim.

Dosyanın kendisi metin düzenleyicide iyi görünüyordu, ancak *.badSQL * yükleyicinin reddedilen satırlarla oluşturduğu dosyayı açtığımda, her orijinal karakter arasında kötü karakterler olduğunu gördüm. Sonra kodlamayı düşündüm.

Orijinal dosyayı Notepad ++ ile açtım ve ANSI'ye dönüştürdüm ve her şey düzgün yüklendi.


-1

ORA-01722 hatası oldukça basittir. Tom Kyte'ye göre :

Bir karakter dizesini bir sayıya açıklık ya da dolaylı olarak dönüştürmeye çalıştık ve başarısız oluyor.

Bununla birlikte, sorunun nerede olduğu genellikle ilk bakışta belirgin değildir. Bu sayfa sorunumu gidermeme, bulmama ve gidermeme yardımcı oldu. İpucu: Açıkça veya örtük olarak bir dizeyi sayıya dönüştürdüğünüz yerleri arayın. (Kodumda vardı NVL(number_field, 'string').)


-1

geçersiz numara hatası aldığınızda bunu da deneyin

Bunda a.emplid sayıdır ve b.emplid bir varchar2'dir, bu nedenle kenarlardan birini dönüştürmeniz gerekiyorsa

nerede to_char (a.emplid) = b.emplid


-4

Bu hatayı gidermek için her zaman TO_NUMBER () işlevini kullanabilirsiniz. Bu, INSERT INTO çalışanların telefon_numarası değerleri olarak dahil edilebilir (TO_NUMBER ('0419 853 694');

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.