Kesalahan SQL "ORA-01722: nomor tidak valid"

101

Yang sangat mudah bagi seseorang, Sisipan berikut memberi saya

ORA-01722: nomor tidak valid

Mengapa?

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');
Phillip Gibson
sumber
28
Jadi ... untuk apa definisi tabel CUSTOMER? Anda hanya memberikan setengah dari informasi yang dibutuhkan.
Greg Hewgill
3
Nomor telepon adalah satu-satunya hal yang mungkin dapat didefinisikan sebagai angka yang tidak direpresentasikan oleh data Anda sebagai angka (spasi bukan angka). Jadi: periksa definisi tabel Anda dan bandingkan dengan pernyataan masukan Anda.
APC
10
Mengapa orang-orang menolak pertanyaan ini. Bagi orang yang baru mengenal database, ini adalah kesalahan yang aneh. Saya dapat melihat bagaimana melampirkan nilai dengan tanda kutip dapat membuatnya terlihat seperti string. Itu hanya tergantung pada apa database diatur sebagai. Mungkin semua string atau angka tergantung pada bidangnya. Mungkin itu adalah kesalahan saat database dibuat.
sisharp
Contoh di mana situasi di atas datang: masukkan ke dalam table_1 (rollNumber) nilai ('123'); dimana rollNumber adalah kolom bertipe "number".
Ishani Gupta
3
"Kembali pada pukul dua belas, saya menarik sebuah buku dari rak, dan menjawab pertanyaan Oracle. Di 'Stack saya masih mahir, dengan pengetahuan yang saya simpan, tapi saya masih belum menerima. "
Aaron

Jawaban:

121

Kesalahan ORA-01722 terjadi ketika upaya dilakukan untuk mengubah string karakter menjadi angka, dan string tidak dapat diubah menjadi angka.

Tanpa melihat definisi tabel Anda, sepertinya Anda mencoba mengonversi urutan numerik di akhir daftar nilai Anda menjadi angka, dan spasi yang membatasinya menimbulkan kesalahan ini. Tetapi berdasarkan informasi yang Anda berikan kepada kami, itu bisa terjadi di bidang apa pun (selain yang pertama).

Aaron
sumber
2
Juga perhatikan bahwa mengisi bidang secara manual dengan "(null)" akan menghasilkan kesalahan itu. Jika defaul adalah null dan Anda tidak menyelesaikannya, maka akan otomatis selesai dengan (null) tetapi tidak sama saat Anda mengetiknya.
bogdan.rusu
Eh, "string tidak bisa diubah menjadi angka" - Ini bukan intinya. String DAPAT diubah menjadi angka. Intinya di sini adalah konversi kebalikan dari angka menjadi kolom String, tetapi Oracle tidak melakukannya secara otomatis: Anda harus menjadikannya String sendiri, menandai nilai secara eksplisit dalam ekspresi SQL Anda, untuk mengelilinginya dengan '' ATAU "" .
Franta
25

Misalkan nomor telepon ditentukan NUMBERmaka bagian kosong tidak dapat diubah menjadi nomor:

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

Di atas memberi Anda a

ORA-01722: nomor tidak valid

hol
sumber
16

Inilah salah satu cara untuk mengatasinya. Hapus karakter non-numerik lalu transmisikan sebagai angka.

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
gmlacrosse.dll
sumber
6
Melakukan ini akan menghapus awalan 0.
Joe C
2
ini masuk ke OP asli - kolom tabel Anda tidak boleh bertipe "angka" jika Anda ingin menyimpan nilai seperti '0419 853 694' karena angka tidak boleh memiliki nol di depannya. Namun dalam kasus saya ini hanya yang saya butuhkan, ty gmlacrosse!
hipokito
10

Karena kesalahan ini muncul saat Anda mencoba memasukkan nilai non-numerik ke dalam kolom numerik dalam db, tampaknya bidang terakhir Anda mungkin berupa angka dan Anda mencoba mengirimkannya sebagai string dalam database. periksa nilai terakhir Anda.

Freelancer
sumber
8

Nah bisa juga:

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

dimana untuk penggabungan dalam oracle digunakan operator ||tidak +.

Dalam hal ini Anda mendapatkan: ORA-01722: invalid number ...

Lazar Lazarov
sumber
1
Itu bagus. Takdir beracun lainnya mungkin seperti ini. Anda mengomentari sebuah field dalam SELECT Fieldlist seperti - t.fieldname. Nanti Anda bermaksud untuk menghapus komentar awal baris itu, tetapi satu karakter yang dikomentari ditinggalkan secara tidak sengaja. Jadi ada: - t.fieldname. Ini terjadi pada saya, ketika saya mengerjakan kueri yang sangat besar, di mana saya harus mengomentari / membatalkan komitmen ratusan kolom, saat mengatur ulang binatang itu.
olippuner
8

Hal ini karena:

Anda menjalankan pernyataan SQL yang mencoba mengonversi string menjadi angka, tetapi tidak berhasil.

Seperti yang dijelaskan di:

Untuk mengatasi kesalahan ini:

Hanya bidang numerik atau bidang karakter yang berisi nilai numerik yang dapat digunakan dalam operasi aritmatika. Pastikan semua ekspresi bernilai angka.

Mahmoud Gamal
sumber
4

Oracle melakukan konversi String2number otomatis , untuk nilai kolom String ! Namun, untuk perbandingan tekstual dalam SQL, masukan harus dibatasi sebagai String secara eksplisit: Konversi yang berlawanan number2String tidak dilakukan secara otomatis, tidak pada tingkat kueri SQL.

Saya punya pertanyaan ini:

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

Yang itu menimbulkan masalah: Error: ORA-01722: invalid number

Saya baru saja mengapit nilai "numerik" , untuk menjadikannya 'String' , hanya membuatnya dibatasi secara eksplisit :

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

... dan voila: Ini mengembalikan hasil yang diharapkan.

edit: Dan memang: kolom acc_numdi tabel saya didefinisikan sebagai String. Meski tidak numerik, namun invalid numberdilaporkan. Dan pembatas eksplisit dari nomor-string menyelesaikan masalah.

Di sisi lain, Oracle dapat memperlakukan String sebagai angka. Jadi operasi / fungsi numerik dapat diterapkan pada String, dan kueri ini berfungsi:

pilih max (string_column) dari TABLE;

pilih string_column dari TABLE di mana string_column antara '2' dan 'z';

pilih string_column dari TABLE di mana string_column > '1';

pilih string_column dari TABLE di mana string_column <= 'b';

Franta
sumber
saya mengalami situasi yang sama. ora-01722 nomor tidak valid dipicu pada pernyataan pilih, bukan pernyataan sisipkan. Saya memeriksa definisi tabel dan menemukan bahwa kolomnya adalah varchar, bukan angka, jadi saya menambahkan tanda kutip tunggal di sekitar angka
Newton fan 01
2

Dalam kasus saya, kesalahan konversi berada dalam indeks berbasis fungsional , yang telah saya buat untuk tabel.

Data yang dimasukkan oke. Butuh beberapa saat bagi saya untuk mengetahui bahwa kesalahan sebenarnya berasal dari indeks buggy.

Alangkah baiknya, jika Oracle bisa memberikan pesan kesalahan yang lebih tepat dalam kasus ini.

saya ambil
sumber
1

Jika Anda membuat insert into...select * from...pernyataan, mudah juga untuk mendapatkan kesalahan 'Nomor Tidak Valid'.

Misalkan Anda memiliki tabel bernama FUND_ACCOUNTyang memiliki dua kolom:

AID_YEAR  char(4)
OFFICE_ID char(5)

Dan katakanlah Anda ingin mengubah OFFICE_ID menjadi numerik, tetapi ada baris yang ada di tabel, dan lebih buruk lagi, beberapa baris tersebut memiliki nilai OFFICE_ID '' (kosong). Di Oracle, Anda tidak dapat mengubah tipe data kolom jika tabel memiliki data, dan ini membutuhkan sedikit trik untuk mengubah a '' menjadi 0. Jadi, berikut cara melakukannya:

  1. Buat tabel duplikat: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Hapus semua baris dari tabel asli: DELETE FROM FUND_ACCOUNT;
  3. Setelah tidak ada data di tabel asli, ubah tipe data di kolom OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. Tapi inilah bagian yang sulit. Karena beberapa baris berisi nilai OFFICE_ID kosong, jika Anda melakukan yang sederhana INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, Anda akan mendapatkan kesalahan "ORA-01722 Invalid Number". Untuk mengonversi '' (kosong) OFFICE_ID menjadi 0, pernyataan penyisipan Anda harus terlihat seperti ini:

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

Frank Staheli
sumber
Ini adalah contoh yang sangat rumit dari kasus di mana kesalahan dapat terjadi + penjelasan bagaimana menyelesaikan kasus tertentu, yang mungkin tidak berlaku sama sekali.
Jan Doggen
0

Ini juga terjadi pada saya, tetapi masalahnya sebenarnya berbeda: pengkodean file .

File benar, tetapi encoding file salah. Itu dihasilkan oleh utilitas ekspor SQL Server dan saya menyimpannya sebagai Unicode.

File itu sendiri terlihat bagus di editor teks, tetapi ketika saya membuka *.badfile yang dibuat oleh pemuat SQL * dengan baris yang ditolak, saya melihat ada karakter buruk di antara setiap karakter asli. Kemudian saya memikirkan tentang pengkodean.

Saya membuka file asli dengan Notepad ++ dan mengubahnya menjadi ANSI, dan semuanya dimuat dengan benar.

ciencia
sumber
-1

Kesalahan ORA-01722 cukup mudah. Menurut Tom Kyte :

Kami telah mencoba untuk secara eksplisit atau implikasinya mengonversi string karakter menjadi angka dan gagal.

Namun, di mana masalahnya seringkali tidak terlihat pada awalnya. Halaman ini membantu saya memecahkan masalah, menemukan, dan memperbaiki masalah saya. Petunjuk: cari tempat di mana Anda secara eksplisit atau implisit mengonversi string menjadi angka. (Saya ada NVL(number_field, 'string')di kode saya.)

Baodad
sumber
-1

coba ini juga, ketika Anda memiliki kesalahan nomor yang tidak valid

Dalam a.emplid ini adalah angka dan b.emplid adalah varchar2 jadi jika Anda harus mengonversi salah satu sisi

dimana to_char (a.emplid) = b.emplid

Jay
sumber
-4

Anda selalu dapat menggunakan fungsi TO_NUMBER () untuk menghapus kesalahan ini. Ini dapat dimasukkan sebagai INSERT INTO karyawan phone_number values ​​(TO_NUMBER ('0419 853 694');

Harshit Gupta
sumber