2014-10-07 1 views
1

Я хочу вставить значение float в столбец типа float в таблице. Но стоимость, поступающая из системы Cobol/Mainframe после вычисления 5,4999999, но я хочу вставить 5.50 или 5.49 в таблицу оракула без использования круглой функции. Итак, есть ли способ установить значение float до двух знаков после запятой для всех пользователей в oracle 11g или как какой-либо параметр, выполненный SYSDBA для всех пользователей или значение номера по умолчанию до 2 или n чисел десятичных знаков? Заранее спасибо.Завершить поплавок в оракуле 11g до 2-х мест для всех пользователей

+0

Почему вы не хотите использовать 'round' (или' trunc', если вы хотите, 5.49)? Как выполняется вставка - может быть, есть слой клиента, который может настроить значение для вас, используя свои собственные функции, если вы не хотите использовать Oracle. Или задайте точность столбца, как предлагает nop77svk, если вы хотите округлить значение. Я полагаю, вы могли бы использовать триггер, чтобы приспособить его значение, но это похоже на значительное усложнение простой задачи. –

+0

Спасибо @Alex Poole, я не могу изменить код кобальта/мэйнфрейма, много инструкций вставки написано примерно в 1000. Именно поэтому я ищу лучшее решение. –

+1

Можете ли вы показать пример получаемого вами значения. Было бы очень необычно (и глупо) передавать число с плавающей запятой из мэйнфрейма в не-мейнфрейм. Почему ваша колонка «float», если вы не хотите иметь плавающие числа? У вас есть макет записи для данных, поступающих с мэйнфрейма? Что вы подразумеваете под «после расчета»? –

ответ

1

Нет, нет такой вещи, как «установка значения с плавающей точкой до 2 десятичных знаков для всех пользователей в Oracle».

Вы можете либо изменить столбец целевой таблицы на number(*,2), либо использовать округление.

+0

спасибо @ nop77svk за ваш ответ. Проблема в том, что я не могу изменить структуру таблицы (float to number), ее устаревшую таблицу и содержит много данных. –

1

Вы можете создать свою таблицу, используя столбец, определенный как число с точностью и масштабом.

create table temp_foo (test number(4,2)); 

Это означает, что тест столбец будет максимум из 4 цифр в длину, с 2 после десятичной запятой.

Затем вставив следующий ...

insert into temp_foo values(54.345); 

А затем выбрать ...

select * from temp_foo; 

приведет к значению 54,35

Если вы хотите, чтобы большее количество затем увеличьте точность, чтобы сказать 10, и сохраните масштаб на 2 - НОМЕР (10,2) - теперь вы можете вставить 12345678.234535, и вы получите 12345678.23 обратно.

Таким образом, создайте таблицу для хранения данных в требуемом формате. Пусть Oracle сделает тяжелую работу :)

Надеюсь, что это поможет.

+0

благодарит @RandiiRedneck за ваш ответ. Проблема в том, что я не могу изменить структуру таблицы (float to number), ее устаревшую таблицу и содержит много данных. Я смотрю что-то похожее на тип/параметр nls_numeric_characters. –

4

Невозможно определить постоянный «формат», в котором люди всегда будут видеть числа.

Если вы не можете изменить таблицу из-за устаревших проблем, то очевидной задачей было бы создать представление в таблице, чтобы преобразовать данные в то, что вы хотите. Вы можете переименовать исходную таблицу и назовите представление так же, как и исходную таблицу, чтобы избежать изменения всего кода. Проверьте это первым.

rename my_table to my_table_float 

create or replace view my_table as 
select <some_columns> 
     , cast(my_float_column as number(36, 2)) as my_float_column 
    from my_table_float 

Это решение кажется мне немного опасно - вы должны точно знать, какой код используется столбец и убедитесь, что этот код не ожидает, что поплавок. Лично я всегда больше склоняюсь к преобразованию данных по мере необходимости, а не к предположению, что он должен быть в определенном формате до его использования.

1

Если вы не можете изменить код вставки, чтобы добавить вызов round(), не можете изменить значение, передаваемое во вставку, и не можете изменить структуру таблицы ... тогда вы могли бы использовать замену вида Ben предполагает; или отрегулировать данные, поскольку они запрашиваются непосредственно из таблицы; или добавить триггер для округлять значение, как он вставлен:

create table t42 (id integer, value float); 

-- value inserted with more precision than you want 
insert into t42 values (1, 5.4999999); 

create or replace trigger tr42 
before insert or update on t42 
for each row 
begin 
    :new.value := round(:new.value, 2); 
end; 
/

-- value inserted with two decimal places of precision 
insert into t42 values (2, 5.4999999); 

select * from t42 order by id; 

     ID  VALUE 
---------- ---------- 
     1 5.4999999 
     2  5.5 

SQL Fiddle demo. Использование триггера для чего-то вроде этого кажется излишним, но если вы действительно исчерпали все другие возможности, то это может быть что-то рассмотреть.

Если вы хотите, чтобы получить 5,49, когда 5,4999999 вставлена, то вы могли бы использовать вместо trunc(value, 2):

create or replace trigger tr42 
before insert or update on t42 
for each row 
begin 
    :new.value := trunc(:new.value, 2); 
end; 
/

insert into t42 values (3, 5.4999999) 
/

select * from t42 order by id; 

     ID  VALUE 
---------- ---------- 
     1 5.4999999 
     2  5.5 
     3  5.49