programing

Oracle에서 숫자 열의 정밀도 변경

madecode 2023. 3. 9. 22:37
반응형

Oracle에서 숫자 열의 정밀도 변경

현재 NUMBER로 선언된 컬럼이 있습니다.컬럼의 정밀도를 NUMBER(14,2)로 변경하고 싶습니다.

그래서 명령어를 실행했습니다.

 alter table EVAPP_FEES modify AMOUNT NUMBER(14,2)'

에러가 발생했습니다.

   column to be modified must be empty to decrease precision or scale

열을 비워두면서 정밀도를 변경하려고 하는 것 같습니다. 왜 열을 늘리는 동안 열을 줄이겠다고 하는지 알 수 없습니다. 열의 데이터는 손실되지 않습니다.이에 대한 간단한 해결 방법이 있습니까?전송과 삭제 사이에 데이터가 손실될 위험이 있으므로 나중에 다른 테이블에 복사하거나 열 이름을 변경하고 열 사이에 복사하지 마십시오.

처음에 정밀도를 설정하지 않았다고 가정하면 최대(38)로 가정합니다.38에서 14로 변경하기 때문에 정밀도가 저하되고 있습니다.

가장 쉬운 방법은 열의 이름을 변경하고 데이터를 복사한 다음 원래 열을 삭제하는 것입니다.

alter table EVAPP_FEES rename column AMOUNT to AMOUNT_OLD;

alter table EVAPP_FEES add AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_OLD;

alter table EVAPP_FEES drop column AMOUNT_OLD;

열 순서를 유지하려면 대신 데이터를 두 번 이동할 수 있습니다.

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2);

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT;

update EVAPP_FEES set AMOUNT = null;

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP;

alter table EVAPP_FEES drop column AMOUNT_TEMP;

스케일을 설정함으로써 정밀도를 낮출 수 있습니다.NUMBER(16,2)를 시도합니다.

테이블이 압축되면 다음과 같이 동작합니다.

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2);

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT;

update EVAPP_FEES set AMOUNT = null;

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP;

alter table EVAPP_FEES move nocompress;

alter table EVAPP_FEES drop column AMOUNT_TEMP;

alter table EVAPP_FEES compress;

언급URL : https://stackoverflow.com/questions/9233909/changing-precision-of-numeric-column-in-oracle

반응형