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.