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무엇입니까? 필요한 정보의 절반 만 제공했습니다.
— Greg Hewgill 2012 년

3
전화 번호는 데이터가 숫자로 표시되지 않는 숫자로 합리적으로 정의 될 수있는 유일한 것입니다 (공백은 숫자가 아님). 따라서 테이블 정의를 확인하고 입력 문과 비교하십시오.
— APC

10
사람들이 왜이 질문에 반대표를 던졌을까요? 데이터베이스를 처음 접하는 사람들에게 이것은 이상한 오류입니다. 값을 따옴표로 묶으면 문자열처럼 보일 수 있습니다. 데이터베이스 설정에 따라 다릅니다. 모두 문자열이거나 숫자 일 수 있으며 필드에 따라 다릅니다. 데이터베이스를 만들 때 오류 일 수 있습니다.
— sisharp

위 상황이 발생하는 예 : insert into table_1 (rollNumber) values ​​( '123'); 여기서 rollNumber는 "number"유형의 열입니다.
— Ishani 굽타

3
"12 시로 돌아와서 책을 뜯어 내고 오라클의 질문에 답했습니다. 'Stack에서 저는 여전히 잘 알고 있으며 지식을 쌓았지만 여전히 동의 할 수 없습니다 . "
— 아론

답변:


121

ORA-01722 오류는 문자열을 숫자로 변환하려고 시도하고 문자열을 숫자로 변환 할 수없는 경우 발생합니다.

테이블 정의를 보지 않고 값 목록 끝에있는 숫자 시퀀스를 숫자로 변환하려는 것처럼 보이며이를 구분하는 공백으로 인해이 오류가 발생합니다. 그러나 귀하가 제공 한 정보에 따라 모든 분야 (첫 번째 분야 제외)에서 발생할 수 있습니다.


2
또한 "(null)"로 필드를 수동으로 완성하면 해당 오류가 발생합니다. 기본값이 null이고 완료하지 않으면 (null)로 자동 완성되지만 입력 할 때 동일하지 않습니다.
— bogdan.rusu

어, "문자열은 숫자로 변환 할 수 없습니다"-요점이 아닙니다. 문자열은 숫자로 변환 될 수 있습니다. 여기서 요점은 숫자를 문자열 열로의 반대 변환이지만 Oracle은 자동으로 수행하지 않습니다. ''OR ""로 둘러싸 기 위해 SQL 표현식에서 값을 명시 적으로 표시하여 직접 문자열로 만들어야합니다. .
— Franta

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로 이동합니다. 숫자 앞에 0이있을 수 없기 때문에 '0419 853 694'와 같은 값을 저장하려는 경우 테이블 열은 "숫자"유형이 될 수 없습니다. 제 경우에는 이것이 제가 필요한 것입니다. ty gmlacrosse!
— hipokito 2014-12-26

10

이 오류는 숫자가 아닌 값을 db의 숫자 열에 삽입하려고 할 때 발생하므로 마지막 필드가 숫자 일 수 있으며 데이터베이스에서 문자열로 보내려고합니다. 마지막 값을 확인하십시오.


8

또한 다음과 같습니다.

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

오라클에서 연결이 사용되는 곳은 연산자가 ||아닙니다.+ .

이 경우 다음을 얻습니다. ORA-01722: invalid number ...


1
그거 좋네. 또 다른 유독 한 운명은 이것 일 수 있습니다. -t.fieldname과 같이 SELECT Fieldlist의 필드를 주석 처리했습니다. 나중에 해당 줄 시작 주석을 제거하려고하지만 주석 처리 된 문자가 실수로 남았습니다. 따라서 다음이 있습니다.-t.fieldname. 이것은 내가 수백 개의 컬럼에 대해 주석을 달거나 주석을 제거하는 동시에 짐승을 재구성해야하는 매우 큰 쿼리를 작업 할 때 발생했습니다.
— olippuner

8

이 때문입니다:

문자열을 숫자로 변환하려는 SQL 문을 실행했지만 실패했습니다.

다음에 설명 된대로 :

이 오류를 해결하려면 :

산술 연산에는 숫자 필드 또는 숫자 값이 포함 된 문자 필드 만 사용할 수 있습니다. 모든 표현식이 숫자로 평가되는지 확인하십시오.


4

Oracle은 String 열 값에 대해 자동 String2number 변환을 수행 합니다! 그러나 SQL의 텍스트 비교의 경우 입력은 명시 적으로 문자열로 구분되어야합니다. 반대 변환 number2String은 SQL 쿼리 수준이 아니라 자동으로 수행되지 않습니다.

이 쿼리가 있습니다.

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

그 사람은 문제를 제기했습니다. Error: ORA-01722: invalid number

방금 "숫자" 값을 둘러 싸서 'Strings' 으로 만들고 명시 적으로 구분합니다 .

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

... 및 voilà : 예상 결과를 반환합니다.

편집 : 그리고 실제로 : acc_num내 테이블 의 col 은 String. 수치는 아니지만 invalid number가보고되었습니다. 그리고 문자열 번호 의 명시적인 구분 으로 문제가 해결되었습니다.

반면에 오라클 은 문자열을 숫자로 취급 할 수 있습니다 . 따라서 숫자 연산 / 함수를 문자열에 적용 할 수 있으며 다음 쿼리가 작동합니다.

최대 선택TABLE (문자열 _ 열) ;

TABLE에서 string_column을 선택하십시오. 여기서 string_column 은 '2'와 'z'사이입니다.

TABLE에서 string_column을 선택하십시오. 여기서 string_column > '1';

TABLE에서 string_column을 선택하십시오. 여기서 string_column <= 'b';


비슷한 상황이 발생했습니다. ora-01722 insert 문이 아닌 select 문에서 잘못된 번호가 트리거되었습니다. 테이블 정의를 확인한 결과 열이 숫자 대신 varchar라는 것을 알았으므로 숫자 주위에 작은 따옴표를 추가했습니다
— Newton fan 01

2

제 경우에는 변환 오류가 기능 기반 색인에 있었습니다. 테이블에 대해 만든 에있었습니다.

삽입중인 데이터는 정상입니다. 실제 오류가 버그가있는 색인에서 비롯된 것임을 알아내는 데 시간이 걸렸습니다.

이 경우 오라클이 더 정확한 오류 메시지를 제공 할 수 있다면 좋을 것입니다.


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;


이것은 오류 가 발생할 수 있는 경우의 매우 복잡한 예 + 전혀 적용되지 않을 수있는 특정 경우를 해결하는 방법에 대한 설명입니다.
— Jan Doggen 2015 년

0

이것은 나에게도 발생했지만 실제로 문제는 파일 인코딩 입니다.

파일은 정확하지만 파일 인코딩이 잘못되었습니다. SQL Server의 내보내기 유틸리티에 의해 생성되었으며 유니 코드로 저장했습니다.

텍스트 편집기에서는 파일 자체가 좋아 보였지만 *.bad거부 된 행으로 SQL * loader가 생성 한 파일을 열었을 때 모든 원래 문자 사이에 잘못된 문자가있는 것을 보았습니다. 그런 다음 인코딩에 대해.

메모장 ++로 원본 파일을 열고 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.