Lỗi SQL “ORA-01722: số không hợp lệ”


101

Một điều rất dễ dàng đối với một người nào đó, Phụ trang sau đây mang lại cho tôi

ORA-01722: số không hợp lệ

tại sao?

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
Vậy ... định nghĩa bảng là CUSTOMERgì? Bạn chỉ cung cấp một nửa thông tin cần thiết.
Greg Hewgill

3
Số điện thoại là thứ duy nhất có thể được xác định một cách hợp lý dưới dạng số mà dữ liệu của bạn không thể hiện dưới dạng số (dấu cách không phải là số). Vì vậy: hãy kiểm tra định nghĩa bảng của bạn và so sánh với các câu lệnh đầu vào của bạn.
APC

10
Tại sao mọi người lại bỏ phiếu cho câu hỏi này. Đối với những người mới sử dụng cơ sở dữ liệu, đây là một lỗi kỳ lạ. Tôi có thể thấy cách bao bọc các giá trị bằng dấu ngoặc kép có thể khiến nó giống như một chuỗi. Nó chỉ phụ thuộc vào cơ sở dữ liệu được thiết lập như thế nào. Tất cả có thể là chuỗi hoặc số chỉ phụ thuộc vào các trường. Có thể đó là một lỗi khi cơ sở dữ liệu được tạo.
sisharp

Ví dụ về trường hợp trên xảy ra: insert vào table_1 (rollNumber) giá trị ('123'); trong đó rollNumber là một cột kiểu "số".
Ishani Gupta,

3
"Trở lại năm mười hai, tôi lôi một cuốn sách ra khỏi kệ và trả lời một câu hỏi của Oracle. Tại 'Stack, tôi vẫn rất giỏi, với kiến ​​thức mà tôi đã giữ, nhưng tôi vẫn không chấp nhận. '
Aaron

Câu trả lời:


121

Lỗi ORA-01722 xảy ra khi cố gắng chuyển đổi một chuỗi ký tự thành một số và không thể chuyển đổi chuỗi thành một số.

Nếu không nhìn thấy định nghĩa bảng của bạn, có vẻ như bạn đang cố chuyển đổi chuỗi số ở cuối danh sách giá trị của mình thành một số và các khoảng trắng phân tách nó đang gây ra lỗi này. Nhưng dựa trên thông tin bạn đã cung cấp cho chúng tôi, điều đó có thể xảy ra trên bất kỳ trường nào (ngoài trường đầu tiên).


2
Cũng lưu ý rằng hoàn thành thủ công một trường với "(null)" sẽ gây ra lỗi đó cho bạn. Nếu giá trị mặc định là null và bạn không hoàn thành, nó sẽ tự động hoàn thành với (null) nhưng nó không giống như vậy khi bạn nhập nó.
bogdan.rusu

Ơ, "chuỗi không thể chuyển thành số" - Đó không phải là vấn đề. Chuỗi CÓ THỂ được chuyển đổi thành số. Vấn đề ở đây là việc chuyển đổi ngược lại một số thành một cột Chuỗi, nhưng Oracle không tự động làm điều đó: Bạn phải tự đặt nó thành Chuỗi, đánh dấu giá trị một cách rõ ràng trong biểu thức SQL của bạn, bao quanh nó bằng '' HOẶC "" .
Franta

25

Giả sử số điện thoại được xác định như vậy NUMBERthì các ô trống không thể chuyển đổi thành số:

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

Trên đây cung cấp cho bạn một

ORA-01722: số không hợp lệ


16

Đây là một cách để giải quyết nó. Loại bỏ các ký tự không phải số sau đó ép nó thành một số.

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

6
Làm điều này sẽ loại bỏ số 0 dẫn đầu
Joe C

2
điều này chuyển đến OP ban đầu - cột trong bảng của bạn không thể thuộc loại "số" nếu bạn muốn lưu trữ các giá trị như '0419 853 694' vì số không được có số 0 ở đầu. tuy nhiên trong trường hợp của tôi đây chỉ là những gì tôi cần, ty gmlacrosse!
hipokito

10

Vì lỗi này xảy ra khi bạn đang cố gắng chèn giá trị không phải số vào một cột số trong db, có vẻ như trường cuối cùng của bạn có thể là số và bạn đang cố gắng gửi nó dưới dạng một chuỗi trong cơ sở dữ liệu. kiểm tra giá trị cuối cùng của bạn.


8

Nó cũng có thể là:

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

nơi để nối trong oracle được sử dụng toán tử ||not +.

Trong trường hợp này, bạn nhận được: ORA-01722: invalid number ...


1
Nó là cái tốt. Một số phận độc hại khác có thể là điều này. Bạn đã nhận xét một trường trong Danh sách trường CHỌN như - t.fieldname. Sau đó, bạn định xóa nhận xét bắt đầu dòng đó, nhưng một ký tự được nhận xét đã vô tình bỏ lại. Do đó có: - t.fieldname. Điều này đã xảy ra với tôi, khi tôi đang làm việc với một truy vấn rất lớn, nơi tôi phải nhận xét / bỏ ghi chú hàng trăm cột, trong khi sắp xếp lại con thú.
olippuner

8

Điều này là do:

Bạn đã thực thi một câu lệnh SQL cố gắng chuyển đổi một chuỗi thành một số, nhưng không thành công.

Như đã giải thích trong:

Để giải quyết lỗi này:

Chỉ các trường số hoặc trường ký tự có chứa giá trị số mới có thể được sử dụng trong các phép toán số học. Đảm bảo rằng tất cả các biểu thức đánh giá thành số.


4

Oracle thực hiện chuyển đổi String2number tự động , cho các giá trị cột String ! Tuy nhiên, đối với các so sánh văn bản trong SQL, đầu vào phải được phân định rõ ràng dưới dạng Chuỗi: Số chuyển đổi ngược lại2String không được thực hiện tự động, không phải ở cấp truy vấn SQL.

Tôi đã có truy vấn này:

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

Đó là một trong những trình bày một vấn đề: Error: ORA-01722: invalid number

Tôi vừa bao quanh các giá trị "số" , để biến chúng thành 'Chuỗi' , vừa làm cho chúng được phân tách rõ ràng :

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

... và voilà: Nó trả về kết quả mong đợi.

chỉnh sửa: Và thực sự: col acc_numtrong bảng của tôi được định nghĩa là String. Mặc dù không phải là số, nhưng invalid numberđã được báo cáo. Và việc phân định rõ ràng các số chuỗi đã giải quyết được vấn đề.

Mặt khác, Oracle có thể coi Chuỗi là số. Vì vậy, các phép toán / hàm số có thể được áp dụng trên các Chuỗi và các truy vấn này hoạt động:

chọn max (chuỗi_cột) từ TABLE;

chọn string_column từ TABLE trong đó string_column giữa '2' và 'z';

chọn string_column từ TABLE trong đó string_column > '1';

chọn string_column từ TABLE trong đó string_column <= 'b';


tôi gặp phải một tình huống tương tự. ora-01722 không hợp lệ-số được kích hoạt tại một câu lệnh chọn, không phải một câu lệnh chèn. Tôi đã kiểm tra định nghĩa bảng và thấy rằng cột là một varchar thay vì số, vì vậy tôi đã thêm các dấu ngoặc kép xung quanh số
Newton fan 01

2

Trong trường hợp của tôi, lỗi chuyển đổi nằm trong chỉ mục dựa trên chức năng mà tôi đã tạo cho bảng.

Dữ liệu được chèn vào là OK. Tôi đã mất một lúc để tìm ra rằng lỗi thực sự đến từ chỉ mục lỗi.

Sẽ rất tuyệt nếu Oracle có thể đưa ra thông báo lỗi chính xác hơn trong trường hợp này.


1

Nếu bạn thực hiện một insert into...select * from...câu lệnh, bạn cũng dễ gặp phải lỗi 'Số không hợp lệ'.

Giả sử bạn có một bảng được gọi là FUND_ACCOUNTcó hai cột:

AID_YEAR  char(4)
OFFICE_ID char(5)

Và giả sử bạn muốn sửa đổi OFFICE_ID thành số, nhưng có các hàng hiện có trong bảng và tệ hơn nữa, một số hàng trong số đó có giá trị OFFICE_ID là '' (trống). Trong Oracle, bạn không thể sửa đổi kiểu dữ liệu của cột nếu bảng có dữ liệu và nó đòi hỏi một thủ thuật nhỏ để chuyển đổi một '' thành 0. Vì vậy, đây là cách thực hiện:

  1. Tạo một bảng trùng lặp: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Xóa tất cả các hàng khỏi bảng gốc: DELETE FROM FUND_ACCOUNT;
  3. Khi không có dữ liệu nào trong bảng gốc, hãy thay đổi kiểu dữ liệu của cột OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. Nhưng đây là phần phức tạp. Bởi vì một số hàng chứa giá trị OFFICE_ID trống, nếu bạn làm đơn giản INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, bạn sẽ gặp lỗi "ORA-01722 Số không hợp lệ". Để chuyển đổi OFFICE_IDs '' (trống) thành 0, câu lệnh chèn của bạn sẽ phải trông như sau:

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


Đây là một ví dụ rất phức tạp về một trường hợp có thể xảy ra lỗi + giải thích cách giải quyết trường hợp cụ thể đó, điều này có thể không áp dụng được.
Jan Doggen

0

Điều này cũng xảy ra với tôi, nhưng vấn đề thực sự khác: mã hóa tệp .

Tệp đúng, nhưng mã hóa tệp sai. Nó được tạo bởi tiện ích xuất của SQL Server và tôi đã lưu nó dưới dạng Unicode.

Bản thân tệp trông đẹp trong trình soạn thảo văn bản, nhưng khi tôi mở *.badtệp mà trình tải SQL * tạo ra với các dòng bị từ chối, tôi thấy nó có các ký tự xấu giữa mọi ký tự gốc. Sau đó, tôi mặc dù về mã hóa.

Tôi đã mở tệp gốc bằng Notepad ++ và chuyển đổi nó thành ANSI và mọi thứ được tải đúng cách.


-1

Lỗi ORA-01722 khá đơn giản. Theo Tom Kyte :

Chúng tôi đã cố gắng chuyển đổi một chuỗi ký tự thành một số và nó không thành công.

Tuy nhiên, vấn đề ban đầu thường không rõ ràng ở đâu. Trang này đã giúp tôi gỡ rối, tìm và khắc phục sự cố của mình. Gợi ý: hãy tìm những nơi bạn đang chuyển đổi một cách rõ ràng hoặc ngầm định một chuỗi thành một số. (Tôi đã có NVL(number_field, 'string')trong mã của mình.)


-1

cũng hãy thử điều này, khi bạn gặp lỗi số không hợp lệ

Trong a.emplid này là số và b.emplid là một varchar2, vì vậy nếu bạn phải chuyển đổi một trong các bên

nơi to_char (a.emplid) = b.emplid


-4

Bạn luôn có thể sử dụng hàm TO_NUMBER () để loại bỏ lỗi này. Hàm này có thể được bao gồm ở dạng CHÈN VÀO các giá trị phone_number của nhân viên (TO_NUMBER ('0419 853 694');

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.