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');
CUSTOMER
? Anda hanya memberikan setengah dari informasi yang dibutuhkan.Jawaban:
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).
sumber
Misalkan nomor telepon ditentukan
NUMBER
maka bagian kosong tidak dapat diubah menjadi nomor:Di atas memberi Anda a
sumber
Inilah salah satu cara untuk mengatasinya. Hapus karakter non-numerik lalu transmisikan sebagai angka.
sumber
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.
sumber
Nah bisa juga:
dimana untuk penggabungan dalam oracle digunakan operator
||
tidak+
.Dalam hal ini Anda mendapatkan:
ORA-01722: invalid number ...
sumber
Hal ini karena:
Seperti yang dijelaskan di:
Untuk mengatasi kesalahan ini:
sumber
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:
Yang itu menimbulkan masalah:
Error: ORA-01722: invalid number
Saya baru saja mengapit nilai "numerik" , untuk menjadikannya 'String' , hanya membuatnya dibatasi secara eksplisit :
... dan voila: Ini mengembalikan hasil yang diharapkan.
edit: Dan memang: kolom
acc_num
di tabel saya didefinisikan sebagaiString
. Meski tidak numerik, namuninvalid number
dilaporkan. 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:
sumber
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.
sumber
Jika Anda membuat
insert into...select * from...
pernyataan, mudah juga untuk mendapatkan kesalahan 'Nomor Tidak Valid'.Misalkan Anda memiliki tabel bernama
FUND_ACCOUNT
yang memiliki dua kolom: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:
CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
DELETE FROM FUND_ACCOUNT;
Setelah tidak ada data di tabel asli, ubah tipe data di kolom OFFICE_ID:
ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);
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;
sumber
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
*.bad
file 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.
sumber
Kesalahan ORA-01722 cukup mudah. Menurut Tom Kyte :
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.)sumber
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
sumber
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');
sumber