Помилка SQL "ORA-01722: недійсне число"


101

Дуже легкий для когось. Наступна вставка надає мені

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? Ви дали лише половину необхідної інформації.
Грег Х'югілл

3
Телефонні номери - це єдине, що може бути визначено як числове число, яке ваші дані не представляють як числове (пробіли не числові). Отже: перевірте визначення таблиці та порівняйте зі своїми вхідними висловлюваннями.
APC

10
Чому люди вниз голосують за це питання. Для людей, які не знайомі з базами даних, це дивна помилка. Я бачу, як додавання значень цитатами може виглядати так, що це рядок. Це просто залежить від того, як налаштована база даних. Це можуть бути рядки або числа, просто залежать від полів. Можливо, це була помилка при створенні бази даних.
sisharp

Приклад, у якому наведена вище ситуація: вставити в таблицю_1 (rollNumber) значення ('123'); де rollNumber - це стовпець типу "число".
Ішані Гупта

3
"Повернувшись до o`twelve, я витягнув книгу з полиці і відповів на запитання Oracle. У" Стек я все ще вмілий, знаний, що зберігав, але все ще не маю згоди ".
Аарон

Відповіді:


121

Помилка ORA-01722 виникає при спробі перетворення рядка символів у число, а рядок не може бути перетворена в число.

Не бачачи визначення таблиці, схоже, ви намагаєтеся перетворити числову послідовність у кінці списку значень у число, а пробіли, які її обмежують, кидають цю помилку. Але виходячи з інформації, яку ви нам дали, це може відбуватися в будь-якому полі (крім першого).


2
Також зауважте, що вручну заповніть поле з "(null)", ви отримаєте цю помилку. Якщо значення за замовчуванням є нульовим, а ви не завершите його, воно автоматично заповниться (null), але це не те саме, коли ви вводите його.
bogdan.rusu

Е, "рядок не може бути перетворена в число" - Справа не в цьому. Рядок МОЖЕ бути перетворений в число. Суть у тому, що це протилежне перетворення числа в стовпчик String, але Oracle не робить цього автоматично: ви повинні зробити його String самостійно, позначаючи явно значення у вашому SQL виразі, щоб оточити його "'АБО" " .
Франта

25

Припустимо, телефонний номер визначений, оскільки NUMBERтоді заготовки не можуть бути перетворені в номер:

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

Сказане вище дає вам:

ORA-01722: недійсний номер


16

Ось один із способів вирішити це. Видаліть нечислові символи, а потім додайте їх як число.

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

6
Це дозволить зняти ведучих 0.
Джо 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 використовується оператор ||not +.

У цьому випадку ви отримуєте: ORA-01722: invalid number ...


1
Це хороший. Ще одна отруйна доля може бути такою. Ви прокоментували поле у ​​списку SELECT Field, наприклад - t.fieldname. Пізніше ви маєте намір видалити цей коментар до початку рядка, але один коментований символ залишився випадково. Таким чином, існує: - t.fieldname. Це сталося зі мною, коли я працював над дуже великим запитом, де мені доводиться коментувати / розкручувати сотні колон під час реорганізації звіра.
оліппунер

8

Це відбувається тому:

Ви виконали оператор SQL, який намагався перетворити рядок у число, але це не вдалося.

Як пояснено в:

Щоб вирішити цю помилку:

У арифметичних операціях можуть використовуватися лише числові поля або символьні поля, які містять числові значення. Переконайтесь, що всі вирази оцінюються на числа.


4

Oracle робить автоматичне перетворення String2number для значень стовпців String ! Однак для текстових порівнянь у SQL вхід повинен бути чітко визначений як String: Протилежний номер перетворення2String не виконується автоматично, не на рівні запитів 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';

... і voilà: повертає очікуваний результат.

edit: І справді: col acc_numу моїй таблиці визначається як String. Незважаючи на числові показники, invalid numberповідомлялося. І явне розмежування чисел рядків вирішило проблему.

З іншого боку, Oracle може розглядати рядки як числа. Тож числові операції / функції можуть бути застосовані до рядків, і ці запити працюють:

виберіть max (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, а не вставці. Я перевірив визначення таблиці і виявив, що стовпець є варчаром замість числа, тому я додав одиничні лапки навколо числа
вентилятор Ньютона 01

2

У моєму випадку помилка перетворення була у функціональному індексі , який я створив для таблиці.

Дані, що вставляються, були в порядку. Мені знадобилося певний час, щоб зрозуміти, що фактична помилка походить від індексу баггі.

Було б добре, якби Oracle міг би дати більш точне повідомлення про помилку в цьому випадку.


1

Якщо ви робите insert into...select * from...заяву, помилка "Недійсне число" також легко.

Скажімо, у вас є таблиця з назвою, 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_ID в 0, ваш оператор вставки повинен мати такий вигляд:

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


Це дуже складний приклад випадку, коли може статися помилка + пояснення, як вирішити конкретний випадок, який може взагалі не застосовуватися.
Ян Догген

0

Це сталося і зі мною, але проблема була насправді інша: кодування файлів .

Файл був правильним, але кодування файлу було неправильним. Він був створений утилітою експорту SQL Server, і я зберег його як Unicode.

Сам файл добре виглядав у текстовому редакторі, але коли я відкрив *.badфайл, який завантажувач SQL * генерував із відхиленими рядками, я побачив, що він має погані символи між кожним оригінальним символом. Тоді я хоч про кодування.

Я відкрив оригінальний файл із Notepad ++ і перетворив його в ANSI, і все завантажено належним чином.


-1

Помилка ORA-01722 досить проста. За словами Тома Кайте :

Ми намагалися або експліцитність, або імплікацію перетворити символьний рядок у число, і це не вдається.

Однак де проблема часто спочатку не видно. Ця сторінка допомогла мені вирішити проблему, знайти та виправити свою проблему. Підказка: шукайте місця, де ви явно чи неявно перетворюєте рядок у число. (Я мав NVL(number_field, 'string')у своєму коді.)


-1

спробуйте це також, коли у вас є помилка невірного числа

У цьому a.emplid є числом, а b.emplid - varchar2, тому якщо вам доведеться перетворити одну з сторін

де to_char (a.emplid) = b.emplid


-4

Ви завжди можете використовувати функцію TO_NUMBER (), щоб видалити цю помилку. Це може бути включено як значення INSERT INTO для службових значень значень (TO_NUMBER ('0419 853 694');

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.