ms Oracle: избегайте заполнения пробелами во встроенном SQL

В настоящее время я переношу C-приложение с RdB (OpenVMS) на Oracle 11 (Linux). Теперь я наткнулся на разницу между двумя системами баз данных.

Пример:

create table MYTAB(id number(13), name varchar2(10)) ;

Содержание

Id   Name
1    Smith
2    Smith<blank>    // trailing blank after Smith

Когда я выбираю имена во встроенном SQL, Oracle добавляет конечные пробелы до длины моей переменной хоста, т. е. два имени невозможно различить. Даже если я ОБРЕЗАЮ имя, Oracle добавляет пробелы.

Но с оператором Select по имени столбца я должен указать точное количество пробелов:

select id from MYTAB where name ='Smith'  -> gives Id 1
select id from MYTAB where name ='Smith ' -> gives Id 2

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

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

Заранее большое спасибо Йорг


person Jörg Mohren    schedule 03.12.2015    source источник
comment
Невозможно, чтобы Oracle дополнял пробелы в столбце типа VARCHAR2. Это происходит, только если у вас есть тип CHAR. Если у вас есть такие значения, то единственная причина в том, что сами данные хранятся как заполненные пробелами.   -  person Lalit Kumar B    schedule 03.12.2015


Ответы (2)


Я думаю, что нашел решение сам. Если я добавлю опцию CHAR_MAP=STRING к вызову прекомпилятора, вызовы встроенного SQL для выбора столбца VARCHAR2 не будут заполнять мои строки пробелами. С этим я могу справиться со своей проблемой.

С уважением Йорг

person Jörg Mohren    schedule 04.12.2015

У вас есть поле с VARCHAR2(), которое не вызовет пустого заполнения, если у вас есть CHAR().

В операторе вставки вам нужно TRIM() значение перед вставкой. Мне кажется, ваше преобразование в таблицу неверно.

По вашему выбору вы должны быть в состоянии сделать...

select id from MYTAB where trim(name) ='Smith'

Кроме того, когда вы начинаете использовать такие функции, как TRIM() в предложении where, это может привести к тому, что Oracle просканирует таблицу и проигнорирует индексы.

person Patrick    schedule 03.12.2015
comment
Проблема не в том, что значение заполнено пробелами в базе данных (это не так). Моя проблема в том, что при выборе значения с помощью встроенного SQL значение возвращается с пустым заполнением (заполненное конечными пробелами до длины переменной хоста) - person Jörg Mohren; 04.12.2015