ORA-01440: column to be modified must be empty to decrease precision or scale
기존에 정의된 데이터 타입 사이즈보다 작은 크기의 사이즈로 ALTER MODIFY(변경)하려고 할 때 발생한다.
원래부터 작은 크기의 사이즈로의 수정은 불가하다. (데이터가 모두 NULL인 경우에는 가능할 것으로 예상됨)
원인
아래와 같이 기존에 NUMBER(17,5)로 즉, 총 17자리이되 정수 12자리 소수 5자리로 구성된 NUMBER 타입의 변수를
NUMBER(15,5)로 총 자리 수를 줄일 때 에러가 발생한 것을 볼 수 있다.
해결 방법
1. 수정하려던 사이즈로 새 컬럼을 추가(add)
2. temp 컬럼에 기존의 값 넣기(update)
3. 기존 컬럼 삭제(drop)
4, temp 컬럼명 수정(rename)
-- 1. 수정하려던 사이즈인 NUMBER(15,5)로 DIS_RATE_TEMP 컬럼을 추가
ALTER TABLE TB_INVOICE_UNIT ADD DIS_RATE_TEMP NUMBER(15,5);
-- 2. DIS_RATE_TEMP 컬럼에 기존의 DIS_RATE 컬럼 값을 넣기
UPDATE TB_INVOICE_UNIT SET DIS_RATE_TEMP = DIS_RATE;
-- 3. 기존 컬럼 DIS_RATE 삭제
ALTER TABLE TB_INVOICE_UNIT DROP COLUMN DIS_RATE;
-- 4. DIS_RATE_TEMP 컬럼명을 기존 컬럼명인 DIS_RATE로 수정
ALTER TABLE TB_INVOICE_UNIT RENAME COLUMN DIS_RATE_TEMP TO DIS_RATE;
테이블 정보에서 컬럼의 순서가 바뀌긴 하지만, 해당 방법이 가장 쉽게 해결할 수 있는 방법인 것 같아 사용하였다.
다른 방법으로는 새로운 TEMP 테이블을 만들고, 기존 테이블의 데이터를 INSERT문 형식으로 EXPORT하여 스크립트를 실행할 수 있을 것으로 보인다.
'Oracle' 카테고리의 다른 글
[ORACLE] Invalid Object 확인 및 Compile하여 Valid 시키기 (0) | 2025.05.15 |
---|---|
[SQL] WHERE절에 집계함수? GROUP BY 없이 HAVING절? (0) | 2025.01.15 |
[ORACLE] sys 계정으로 접속하기(터미널cmd, SQLDeveloper) (1) | 2025.01.03 |