ข้อผิดพลาด SQL“ ORA-01722: หมายเลขไม่ถูกต้อง”


104

สิ่งที่ง่ายมากสำหรับใครบางคนส่วนแทรกต่อไปนี้กำลังให้ไฟล์

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คืออะไร? คุณให้ข้อมูลที่จำเป็นเพียงครึ่งเดียว
Greg Hewgill

3
หมายเลขโทรศัพท์เป็นเพียงสิ่งเดียวที่อาจกำหนดเป็นตัวเลขได้อย่างสมเหตุสมผลซึ่งข้อมูลของคุณไม่ได้แสดงเป็นตัวเลข (ช่องว่างไม่ใช่ตัวเลข) ดังนั้น: ตรวจสอบนิยามตารางของคุณและเปรียบเทียบกับคำสั่งป้อนข้อมูลของคุณ
APC

11
ทำไมคนถึงโหวตคำถามนี้ สำหรับผู้ที่เพิ่งเริ่มใช้ฐานข้อมูลนี่เป็นข้อผิดพลาดแปลก ๆ ฉันสามารถดูได้ว่าการใส่เครื่องหมายอัญประกาศอาจทำให้ดูเหมือนเป็นสตริงได้อย่างไร มันขึ้นอยู่กับว่าฐานข้อมูลถูกตั้งค่าเป็นอะไร ทั้งหมดอาจเป็นสตริงหรือตัวเลขขึ้นอยู่กับฟิลด์ อาจเป็นข้อผิดพลาดเมื่อสร้างฐานข้อมูล
sisharp

ตัวอย่างสถานการณ์ข้างต้น: แทรกลงในค่า table_1 (rollNumber) ('123'); โดยที่ rollNumber เป็นคอลัมน์ประเภท "number"
Ishani Gupta

3
"ย้อนกลับไปใน o` สิบสองฉันดึงหนังสือออกจากชั้นวางและตอบคำถามของ Oracle ที่ 'Stack ฉันยังคงเชี่ยวชาญด้วยความรู้ที่ฉันเก็บไว้ แต่ฉันยังไม่ได้รับการยอมรับ "
แอรอน

คำตอบ:


121

ข้อผิดพลาด ORA-01722 เกิดขึ้นเมื่อมีการพยายามแปลงสตริงอักขระเป็นตัวเลขและไม่สามารถแปลงสตริงเป็นตัวเลขได้

หากไม่เห็นคำจำกัดความตารางของคุณดูเหมือนว่าคุณกำลังพยายามแปลงลำดับตัวเลขที่ท้ายรายการค่าของคุณเป็นตัวเลขและช่องว่างที่คั่นจะทำให้เกิดข้อผิดพลาด แต่จากข้อมูลที่คุณให้เราอาจเกิดขึ้นในฟิลด์ใดก็ได้ (นอกเหนือจากข้อมูลแรก)


2
โปรดสังเกตด้วยว่าการกรอกข้อมูลในฟิลด์ด้วยตนเองด้วย "(null)" จะทำให้คุณมีข้อผิดพลาดนั้น หาก defaul เป็นโมฆะและคุณไม่ดำเนินการจะทำให้สมบูรณ์อัตโนมัติด้วย (null) แต่จะไม่เหมือนกันเมื่อคุณพิมพ์
bogdan.rusu

เอ๊ะ "สตริงไม่สามารถแปลงเป็นตัวเลขได้" - ไม่ใช่ประเด็น สตริงสามารถแปลงเป็นตัวเลขได้ ประเด็นนี้คือการแปลงตัวเลขที่ตรงกันข้ามกับคอลัมน์ String แต่ Oracle ไม่ได้ทำโดยอัตโนมัติ: คุณต้องทำให้เป็น String ด้วยตัวเองโดยทำเครื่องหมายค่าอย่างชัดเจนในนิพจน์ SQL ของคุณเพื่อล้อมรอบด้วย '' OR "" .
Franta

26

สมมติว่ามีการกำหนดหมายเลขโทรศัพท์NUMBERแล้วช่องว่างจะไม่สามารถแปลงเป็นตัวเลขได้:

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

ข้างต้นช่วยให้คุณมีไฟล์

ORA-01722: หมายเลขไม่ถูกต้อง


18

นี่เป็นวิธีหนึ่งในการแก้ปัญหา ลบอักขระที่ไม่ใช่ตัวเลขจากนั้นจึงส่งเป็นตัวเลข

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

6
การทำเช่นนี้จะลบ 0 นำหน้า
Joe C

2
สิ่งนี้จะไปที่ OP ดั้งเดิม - คอลัมน์ในตารางของคุณไม่สามารถเป็นประเภท "ตัวเลข" ได้หากคุณต้องการเก็บค่าเช่น '0419 853 694' เนื่องจากตัวเลขไม่สามารถมีศูนย์นำหน้าได้ ในกรณีของฉัน แต่นี่เป็นเพียงสิ่งที่ฉันต้องการ ty gmlacrosse!
hipokito

10

เนื่องจากข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณพยายามแทรกค่าที่ไม่ใช่ตัวเลขลงในคอลัมน์ตัวเลขใน db ดูเหมือนว่าฟิลด์สุดท้ายของคุณอาจเป็นตัวเลขและคุณกำลังพยายามส่งเป็นสตริงในฐานข้อมูล ตรวจสอบค่าสุดท้ายของคุณ


8

นอกจากนี้ยังสามารถ:

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

โดยที่สำหรับการเรียงต่อกันใน oracle จะใช้ตัวดำเนินการ||ไม่+ไม่ได้

ในกรณีนี้คุณจะได้รับ: ORA-01722: invalid number ...


1
นั่นเป็นสิ่งที่ดี โชคชะตาที่เป็นพิษอีกอย่างอาจเป็นเรื่องนี้ คุณแสดงความคิดเห็นในฟิลด์ในรายการฟิลด์ SELECT เช่น - t.fieldname ในภายหลังคุณตั้งใจจะลบความคิดเห็นเริ่มต้นบรรทัดนั้น แต่อักขระที่แสดงความคิดเห็นหนึ่งตัวถูกทิ้งโดยไม่ได้ตั้งใจ ดังนั้นจึงมี: - t.fieldname สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันทำงานกับแบบสอบถามที่มีขนาดใหญ่มากซึ่งฉันต้องแสดงความคิดเห็น / ผิดปกติหลายร้อยคอลัมน์ในขณะที่จัดระเบียบสัตว์ร้ายใหม่
โอลิปปูเนอร์

8

นี้เป็นเพราะ:

คุณดำเนินการคำสั่ง SQL ที่พยายามแปลงสตริงเป็นตัวเลข แต่ไม่สำเร็จ

ตามที่อธิบายไว้ใน:

ในการแก้ไขข้อผิดพลาดนี้:

เฉพาะฟิลด์ตัวเลขหรือฟิลด์อักขระที่มีค่าตัวเลขเท่านั้นที่สามารถใช้ได้ในการดำเนินการทางคณิตศาสตร์ ตรวจสอบให้แน่ใจว่านิพจน์ทั้งหมดประเมินเป็นตัวเลข


4

Oracle ทำการแปลงString2number โดยอัตโนมัติสำหรับค่าคอลัมน์ String ! อย่างไรก็ตามสำหรับการเปรียบเทียบข้อความใน SQL อินพุตต้องถูกคั่นด้วยสตริงอย่างชัดเจน: การแปลง number2String ตรงข้ามจะไม่ดำเนินการโดยอัตโนมัติไม่ใช่ในระดับคิวรี 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';

... และ voila: ส่งคืนผลลัพธ์ที่คาดหวัง

แก้ไข: และแน่นอน: col acc_numในตารางของฉันถูกกำหนดให้เป็นString. แม้ว่าจะไม่ใช่ตัวเลข แต่invalid numberก็มีการรายงาน และการคั่นหมายเลขสตริงอย่างชัดเจนช่วยแก้ปัญหาได้

ในทางกลับกัน Oracle สามารถถือว่า Strings เป็นตัวเลขได้ ดังนั้นการดำเนินการ / ฟังก์ชันเชิงตัวเลขจึงสามารถนำไปใช้กับ Strings ได้และการสืบค้นเหล่านี้ใช้ได้ผล:

เลือกสูงสุด (string_column) จาก TABLE;

เลือก string_column จาก TABLE โดยที่ string_column ระหว่าง '2' และ 'z';

เลือก string_column จาก TABLE โดยที่ string_column > '1';

เลือก string_column จาก TABLE โดยที่ string_column <= 'b';


ฉันพบสถานการณ์ที่คล้ายกัน ora-01722 หมายเลขที่ไม่ถูกต้องถูกทริกเกอร์ที่คำสั่ง select ไม่ใช่คำสั่งแทรก ฉันตรวจสอบคำจำกัดความของตารางและพบว่าคอลัมน์นั้นเป็น varchar แทนที่จะเป็นตัวเลขดังนั้นฉันจึงเพิ่มเครื่องหมายคำพูดเดี่ยวรอบ ๆ ตัวเลข
แฟนนิวตัน 01

2

ในกรณีของฉันข้อผิดพลาดในการแปลงอยู่ในดัชนีตามฟังก์ชันที่ฉันสร้างขึ้นสำหรับตาราง

ข้อมูลที่แทรกก็ใช้ได้ ฉันใช้เวลาสักพักกว่าจะพบว่าข้อผิดพลาดที่แท้จริงมาจากดัชนีบั๊กกี้

คงจะดีถ้า Oracle สามารถให้ข้อความแสดงข้อผิดพลาดที่แม่นยำยิ่งขึ้นในกรณีนี้


2

หากคุณทำinsert into...select * from...คำสั่งคุณจะได้รับข้อผิดพลาด 'Invalid Number' ได้ง่ายเช่นกัน

สมมติว่าคุณมีตารางที่เรียกFUND_ACCOUNTว่ามีสองคอลัมน์:

AID_YEAR  char(4)
OFFICE_ID char(5)

และสมมติว่าคุณต้องการแก้ไข OFFICE_ID ให้เป็นตัวเลข แต่มีแถวที่มีอยู่ในตารางและที่แย่ไปกว่านั้นคือบางแถวเหล่านั้นมีค่า OFFICE_ID เป็น '' (ว่าง) ใน Oracle คุณไม่สามารถแก้ไขประเภทข้อมูลของคอลัมน์ได้หากตารางมีข้อมูลและต้องใช้กลอุบายเล็กน้อยในการแปลง '' เป็น 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 Invalid Number" ในการแปลง '' (ว่าง) OFFICE_IDs เป็น 0 คำสั่งแทรกของคุณจะต้องมีลักษณะดังนี้:

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


นี่เป็นตัวอย่างที่ซับซ้อนมากของกรณีที่อาจเกิดข้อผิดพลาด+ คำอธิบายวิธีแก้ไขกรณีเฉพาะนั้นซึ่งอาจใช้ไม่ได้เลย
ม.ค. Doggen

0

นี้เกิดขึ้นกับฉันเกินไป แต่ปัญหาที่แตกต่างกันจริง: การเข้ารหัสไฟล์

ไฟล์ถูกต้อง แต่การเข้ารหัสไฟล์ผิด มันถูกสร้างขึ้นโดยยูทิลิตี้การส่งออกของ SQL Server และฉันบันทึกเป็น Unicode

ไฟล์นั้นดูดีในโปรแกรมแก้ไขข้อความ แต่เมื่อฉันเปิดไฟล์ *.badไฟล์ที่ตัวโหลด SQL * สร้างขึ้นด้วยบรรทัดที่ถูกปฏิเสธฉันเห็นว่ามีอักขระที่ไม่ถูกต้องระหว่างอักขระดั้งเดิมทุกตัว แล้วฉันก็เกี่ยวกับการเข้ารหัส

ฉันเปิดไฟล์ต้นฉบับด้วย Notepad ++ และแปลงเป็น ANSI และทุกอย่างโหลดถูกต้อง


-1

ข้อผิดพลาด ORA-01722 ค่อนข้างตรงไปตรงมา ตามTom Kyte :

เราได้พยายามแปลงสตริงอักขระเป็นตัวเลขอย่างชัดเจนหรือไม่เรียบง่ายและล้มเหลว

อย่างไรก็ตามปัญหามักไม่ปรากฏในตอนแรก หน้านี้ช่วยฉันในการแก้ปัญหาค้นหาและแก้ไขปัญหาของฉัน คำแนะนำ: มองหาสถานที่ที่คุณกำลังแปลงสตริงเป็นตัวเลขอย่างชัดเจนหรือโดยปริยาย (ฉันมีNVL(number_field, 'string')รหัสของฉัน)


-1

ลองทำเช่นกันเมื่อคุณมีข้อผิดพลาดเกี่ยวกับตัวเลขที่ไม่ถูกต้อง

ใน a.emplid นี้คือตัวเลขและ b.emplid คือ varchar2 ดังนั้นหากคุณต้องแปลงด้านใดด้านหนึ่ง

โดยที่ to_char (a.emplid) = b.emplid


-4

คุณสามารถใช้ฟังก์ชัน TO_NUMBER () เพื่อลบข้อผิดพลาดนี้ได้ตลอดเวลาซึ่งสามารถรวมเป็น INSERT INTO พนักงาน phone_number ค่า (TO_NUMBER ('0419 853 694');

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.