Как вставить формат французского числа в таблицу оракула SQL

Я столкнулся с проблемой вставки французского числа в числовое поле оракула. ​​Я использую SQL Developer IDE. Когда я вставляю номер (скажем, 3,4), он говорит, что это неверный номер. Конкретно,

Я не хочу заменять значение 3,4 на 3,4.

Я также попытался изменить настройку NLS (используя команду

Alter session set NLS_NUMERIC_CHARACTERS=','; 

Если я использую эту команду, я могу вставить прямо в редактор, но команда вставки не работает из-за запятой, Oracle предполагает, что это другое значение.

Любая помощь будет оценена по достоинству.


person The PowerHouse    schedule 30.12.2015    source источник
comment
Вы не можете вставить числовое значение с запятой, вместо этого используйте тип данных varchar   -  person Muhammad Muazzam    schedule 30.12.2015
comment
@MuhammadMuazzam: никогда не храните числа в столбцах varchar. Это очень плохой совет   -  person a_horse_with_no_name    schedule 30.12.2015
comment
@a_horse_with_no_name, как вы можете вставить число с запятой в числовой тип данных?   -  person Muhammad Muazzam    schedule 30.12.2015
comment
@MuhammadMuazzam: ты не можешь, и тебе это не нужно.   -  person a_horse_with_no_name    schedule 30.12.2015
comment
@MuhammadMuazzam То, что вы видите, не так, как оно хранится в базе данных. Запятая и точка являются разделителями, которые используются только для отображения. Например, stackoverflow.com/questions/33145216 /   -  person Lalit Kumar B    schedule 30.12.2015
comment
Вы читали в вопросе: я не хочу заменять значение 3,4 на 3,4   -  person Muhammad Muazzam    schedule 30.12.2015
comment
мы можем и должны вставить запятую в числовое поле, если мы не работаем с проектами в Великобритании или США, см. подробности. Все о настройке NLS см. пример community.oracle.com/thread/945042?start=0&tstart=0   -  person The PowerHouse    schedule 30.12.2015
comment
@MuhammadMuazzam Итак? Ты все еще не понял. Число внутренне хранится как переменный размер. Внутри это мантисса и экспонента. Разделитель предназначен только для отображения и не сохраняется так, как вы его видите.   -  person Lalit Kumar B    schedule 30.12.2015
comment
@mcapatna Вы не можете хранить разделитель в типе данных NUMBER. Вы говорите только об отображении.   -  person Lalit Kumar B    schedule 30.12.2015


Ответы (2)


Вы не можете, и вам не нужно.

Числовой формат для литералов требуется . в качестве десятичного разделителя.

В самом столбце десятичный разделитель вообще не хранится. Вам просто нужно изменить формат отображения числа. В идеале это делается в вашем приложении, не на уровне SQL. Но если вам это нужно в выводе SQL, используйте to_char() для форматирования ваших чисел:

select to_char(your_number_column, '9999D99')
from your_table;

D в маске формата будет заменен десятичным разделителем, определенным настройками NLS текущего сеанса.

Точка . и , возвращаются буквально:

select to_char(your_number_column, '9999,99')
from your_table;

Дополнительные сведения о маске формата to_char() можно найти в руководстве:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements004.htm#BABIGFBA

person a_horse_with_no_name    schedule 30.12.2015
comment
Есть ли какая-либо настройка, которая позволяет пропустить to_char часть и сделать ее по умолчанию ,, но не .? - person zygimantus; 25.10.2016

Ваше приложение/IDE может выполнять неявное преобразование символьных данных в число, которое использует сеанс по умолчанию nls_numeric_characters. Вы можете заставить команду вставки выполнить явное преобразование следующим образом, используя to_number:

SQL> alter session set nls_language = ENGLISH;
Session altered
SQL> alter session set nls_numeric_characters = ',.';
Session altered
SQL> create table t1 (num_col number);
Table created
SQL> insert into t1 (num_col) values ('3.4');
insert into t1 (num_col) values ('3.4')
ORA-01722: invalid number
SQL> -- this is equivalent to:
SQL> insert into t1 (num_col) values (to_number('12345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=.,'));
insert into t1 (num_col) values (to_number('12345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=.,'))
ORA-01722: invalid number
SQL> -- now converting explictly
SQL> insert into t1 (num_col) values (to_number('12.345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=,.'));
1 row inserted
SQL> insert into t1 (num_col) values (to_number('12345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=,.'));
1 row inserted

в NLS_NUMERIC_CHARACTERS первый символ — это десятичный разделитель, а второй — маркер группировки тысяч.

В документации есть дополнительная информация: https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_2117.htm

person Francisco Sitja    schedule 30.12.2015