Усечение значений перед вставкой в ​​базу данных - PullRequest
1 голос
/ 20 февраля 2012

Мы пытаемся изменить точность существующих столбцов в базе данных. Те, которые были определены как NUMBER, мы хотим изменить его на NUMBER (14,2).

Но, поскольку NUMBER имеет точность по умолчанию 38, в базе данных существуют значения, которые встречаются более чем в десятичных разрядах. Таким образом, когда мы создаем дополнительный столбец и пытаемся скопировать его из временной таблицы, это приводит к ошибкам.

 select count(*) into countCol from USER_TAB_COLUMNS where TABLE_NAME = 'EVAPP_INTERFACE' and COLUMN_NAME = 'RESERVE_RATE_NUM' and DATA_SCALE is null; 
 IF (countCol <> 0) then   

 execute immediate 'alter table EVAPP_INTERFACE add RESERVE_RATE_NUM_TMP NUMBER(6,3)' ; 

 execute immediate 'update EVAPP_INTERFACE set RESERVE_RATE_NUM_TMP = RESERVE_RATE_NUM' ; 

 execute immediate 'alter table EVAPP_INTERFACE drop column RESERVE_RATE_NUM' ; 

 execute immediate 'alter table EVAPP_INTERFACE rename column RESERVE_RATE_NUM_TMP to RESERVE_RATE_NUM' ; 


 DBMS_OUTPUT.put_line('This column EVAPP_INTERFACE.RESERVE_RATE_NUM has been modified to the required precision');

Есть ли способ обрезать все значения в столбце?

Как, скажем, столбец имеет

43.8052201822
21.1610909091
76.4761223618
75.8535613657

Я хочу, чтобы все они изменились на

 43.8
 21.16
 76.47
 75.85

РЕДАКТИРОВАТЬ: я знаю, что слово Truncate используется неправильно, но я не знаю лучшего термина для снижения точности.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Совсем не неправильное слово, см .: TRUNC (число) .

Из приведенного ниже примера вы можете увидеть разницу между усечением и округлением:

create table foo(n number);

insert all
into foo values (1.111)
into foo values (5.555)
into foo values (9.999)
select * from dual;

select n, round(n,2), trunc(n, 2) from foo;

         N ROUND(N,2) TRUNC(N,2)
---------- ---------- ----------
     1.111       1.11       1.11
     5.555       5.56       5.55
     9.999         10       9.99
2 голосов
/ 20 февраля 2012

Как насчет использования КРУГЛЫЙ (номер) ?

...