web-dev-qa-db-fra.com

Modification de la précision d'une colonne numérique dans Oracle

Actuellement, j'ai une colonne qui est déclarée comme NUMBER. Je veux changer la précision de la colonne en NUMBER (14,2).

SO, j'ai exécuté la commande

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

pour lequel, j'ai eu une erreur:

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

Je suppose qu'il veut que la colonne soit vide alors qu'il change la précision et je ne sais pas pourquoi il dit que nous voulons la diminuer pendant que nous l'augmentons, les données dans les colonnes ne peuvent pas être perdues. Existe-t-il une solution rapide à cela? Je ne veux pas le copier dans une autre table et le supprimer ensuite, ou renommer une colonne et la copier entre les colonnes, car il y a un risque de perte de données entre les transferts et les suppressions.

37
roymustang86

En supposant que vous n'avez pas défini de précision au départ, il est supposé être le maximum (38). Vous réduisez la précision car vous la modifiez de 38 à 14.

La façon la plus simple de gérer cela est de renommer la colonne, de copier les données, puis de supprimer la colonne d'origine:

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;

Si vous voulez vraiment conserver l'ordre des colonnes, vous pouvez déplacer les données deux fois à la place:

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;
72
Allan

En définissant l'échelle, vous diminuez la précision. Essayez NUMBER (16,2).

1
ron tornambe

Si la table est compressée, cela fonctionnera:

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;
1
DJ Dev J