powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Пустые строки в Oracle и MS
11 сообщений из 11, страница 1 из 1
Пустые строки в Oracle и MS
    #32653481
kto-to
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пустые строки в Oracle и MS

Есть уйма софта, которая через OLEDB.ADO ломится на MSSQL.
Меняем МSSQL на ORACLE.
Многие софтины старые и глупые, а посему вставляют
в таблицу ''(пустые строки ) не пользуясь дефаултами.

Проблема №1:

в MS условие '' ='' - истинно, a ''=null -ложно
в оракле условие '' ='' - ЛОЖНО, a ''=null -ложно
Мне необходимо, чтобы оракл считал пустые строки
"равным" пробелу, а пробел равным пустой строке (как это делает MS)

Возможно ли так настроить оракл?
(Чтобы работало Select * from table where field ='')

Проблема №2:

Эти строки вставляются в поля на которых часто стоит NOT NULL,
что в оракле сразу же вызывает ошибку.
Дежурное решение - разрешить туда писать null.
Писать практически на каждую из 1000 таблиц
before insert - отвратительное решение.

Может есть что-то поизящнее?


Проблема №3:

Можно ли OLEDB.ADO настроить так,
чтобы он на своем уровне пустые строки заменял пробелами
при передаче параметров от клиента к серверу?

Т.е. на клиенте я вызываю хранимую процедуру
со строковым параметром равным пустой строке,
а на сервак на месте этого параметра приходит пробел.
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32653540
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Оракле строка нулевой длинны и null - эквивалентные понятия.
kto-toМне необходимо, чтобы оракл считал пустые строки
"равным" пробелу, а пробел равным пустой строке
Нет, нельзя.
kto-toДежурное решение - разрешить туда писать null.
Почему дежурное решение ? Просто разрешить хранить null и переписывать все модули, ориентированные, что там может быть то-ли значение, то-ли пробел.

Да, это довольно корявая придумка Оракла, и почему разработчики этой СУБД приняли решение считать строку нулевой длинны эвивалентным null извесно только им одним. Более того, в документации написано, что нет никакой гарантии, что такая постановка в следующих версиях сохранится. Пока что и в девятке и в десятке строка нулевой длинны эквивалентна null.
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32655156
kto-to
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zayacВ Оракле строка нулевой длинны и null - эквивалентные понятия.

Это я знал, но надеюсь(-лся), что возможно существует хитрая настройка,
которая этим управляет. Меня в частности интересует Oracle9.
zayac
Почему дежурное решение ? Просто разрешить хранить null и переписывать все модули, ориентированные, что там может быть то-ли значение, то-ли пробел.

Там более 30 человеколет кода, написанного в разное время.
Часть его еще работала с настольными базами.
И по-моему программеры не очень любят,
когда вместо какого-то (не null ) значения
им приходит null.
Кроме того я совсем не уверен,
что там стоят програмные проверки на null,
учитывая что на многих колонках сейчас ЯВНО стоит NOT NULL.
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32655252
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть вопрос почти в тему.
Вроде как в индексы у Оракла NULL значения не включаются.
как быть, если допустим нужно из таблицы выбрать все значения
где somefield is null, и их ну, допустип 2% от всего количества строк.
Будет ли использоваться в этом случае индекс по этому полю?
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32655521
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы мне кажется не в тот форум залезли, идите в Oracle

Кстати, а по-моему очень класно, что строка нулевой длинны равна НУЛУ.
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32655734
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я с этим столкнулся, когда разработчик захотел перенести в оракловые пакеты несколько десятков функций из си. Конечно их необходимо было серьезно переписывать, но хотелось оставить основную идею: функция ищет что-то там и если находит - возвращает в виде строки, если не находит - возвращает пустую строку. Возврат NULLа - это нестандартная ситуация (с точки зрения си, по крайней мере) и ее надо обрабатывать отдельно. А тут оказывается что их уравняли.
basКстати, а по-моему очень класно, что строка нулевой длинны равна НУЛУ.
А что в этом хорошего ? Как заметил gardenman, NULLы не хранятся в индексе, соответственно при условии IS NULL индекс не используется, то что при проэктировании базы это надо учитывать, чтобы не приходилось по многомиллионной таблице искать по такому условию - это уже другой вопрос; NULL не имеет типа - в операциях с различными типами он интерпретируется по разному
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 --конкатенация строк интерпретирует NULL все-таки как пустую строку 
SQL> select 'test'||null c from dual;
C
 ---- 
test

SQL> select  2 +null c from dual;  -- вернет NULL 
         C
 ---------- 
              

Я совсем не против чтобы "считать строку нулевой длинны NULLом или нет" было параметром, даже пусть параметром который можно установить только при создании базы (например кодировка), но только чтобы такой параметр был.

А есть вообще какие-то языки програмирования или СУБД, которые как и Оракл интерпретировали бы строку нулевой длинны и null - как эквивалентные понятия ?
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32656083
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже интересная тема. Возьмем простейший тип CHAR(10)
если мы вставим в поле '12345' то как правило в селекте в этом поле все равно получим '12345_____', значение дополнится пробелами, если это у нас
VARCHAR - на выходе получим то, что вставили - '12345', по идее тогда
вставив '' мы должны получить '__________' в случае CHAR и '' в случае VARCHAR. Но никак не NULL.
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32657231
kto-to
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИТАК: на уровне оракла они непобедимы.
У меня есть такие варианты.

1) Ничего не менять. Разве что убрать дефаулты ='' на поля с Not NULL(-).
+ минимум моих усилий
- будут валиться insert-ы, которые явно не указывали значение поля
+ '__'||field||'__' в oracle и '__'+field+'__' в ms будут работать одинаково
- будут валиться с старые сравнения по этому полю: =, <,>,IN
- в старые приложения будет приходить null из тех полей,
которые были явно NOT NULL, и они будут вылетать по access violation.
- для выборки дефаултовых значений прийдется в зависимости
от типа субд каждый раз использоватьразные куски в SQL
(='' и IS NULL)
- длина дефаултовой строки в оракле -Null, а в ms-0
- в полях с разрешенными NULL не будет различия между
"честными" NULL и их "наглыми родычами" - пустыми строками

2) Поставить дефаулт =пробел и в before insert каждой таблицы
(они у нас уже есть) поставить замену null на пробел.
+ пройдут все insert-ы, которые явно не указывали значение поля
+ во всех старых сравнения по этому полю( =, <,>,IN ) достаточно
будет заменить пустую строку на одиночный пробел и будет
работь на обеих системах
+ поля останутся NOT NULL
+ в старые приложения будет приходить не нулл
+ выборка дефаултовых значений одинакова (=пробел )
+/- длина дефаултовой строки в оракле -1, а в ms-0
(уже лучше - не нужно проверять на нулл)
- '__'||field||'__' в oracle и '__'+field+'__' в ms вернут разные результаты
--- дополнительные задержки за счет усложнения триггеров before insert
+ в полях с разрешенными NULL будут различия между
"честными" NULL и их "наглыми родычами" - пустыми строками
? я не знаю если на таблицу написать еще один триггер before insert,
то в каком порядке они выполнятся

модификации варианта 2 :
3) тригеры и дефаулты вешать только на поля с NOT NULL
+ меньше дополнительные задержки за счет
уменьшения числа полей обновляемых в триггерах before insert
+/- в этих полях не будет различия между
"честными" NULL и их "наглыми родычами" - пустыми строками

4) Вместо пробела использовать '_'
+ в сообщениях об ошибках и отчетах он будет хорошо виден
- это будет серьезным отличием между версиями работающими
с оракле и версиями работающими с мсскл


Я пока склоняюсь к варианту 2) с модификацией 3).

Может я что-то упустил? Ваши мнения/соображения по этому поводу?
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32657287
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basКстати, а по-моему очень класно, что строка нулевой длинны равна НУЛУ.
Можно услышать аргументы?
Вроде как только пару дней назад в форуме оракла сошлись на том, что именно это и неклассно.
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32657310
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zayacЯ совсем не против чтобы "считать строку нулевой длинны NULLом или нет" было параметром, даже пусть параметром который можно установить только при создании базы
Нет. Вот параметр - намного хуже, чем выбрать любую линию поведения.

Подобные переключатели логики приводят к огромным трудностям в поддержке и сопровождении. Простой пример - в Delphi есть среди прочего такой переключатель $H, в зависимости от которого тип string трактуется как либо AnsiString, либо ShortString. Ситуация с этими двумя типами - примерно как с нуллом; и там, и там свои особенности.

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

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

Впрочем, можно найти пример ближе. Представь себе, насколько с таким переключателем станет удобнее отвечать на вопросы типа "как написать запрос", "почему не работает"..
...
Рейтинг: 0 / 0
Пустые строки в Oracle и MS
    #32661051
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, немного позновато и, возможно, бесполезно практически.
zayac функция ищет что-то там и если находит - возвращает в виде строки, если не находит - возвращает пустую строку. Возврат NULLа - это нестандартная ситуация (с точки зрения си, по крайней мере) и ее надо обрабатывать отдельно. А тут оказывается что их уравняли.


NULL в языке C и NULL в базе данных (в Oracle например) - это совершенно разные вещи, разные понятия. NULL в С - нулевой указатель, т.е. просто число 0. В БД NULL - это спец. значение, которое обозначает "отсутствие значения".
Практически никогда при получении данных из БД в программу на С значение поля БД, равное NULL не отображается в NULL языка C - как правило, всегда сущеструет отдельный явный признак, что поле БД было равно NULL.
Поэтому не надо анализировать код на PL/SQL с точки зрения логичности кода C.

Что касается ORACLE NULL=='', то тут все ясно - видимо для физического представления строки нулевой длины и строки, содержащей NULL, ORACLE использует одно и то же - строку с нулевой длиной, или нулевой указатель.
MSSQL изпользует строку с длиной 0 для '' и "отсутствие поля на странице данных" (поле данных нулевой длины) для представления NULL.

И уже в области практического - я не понял, как ты прореагировал на идею о CHAR и VARCHAR. CHAR не может содержать пустой строки - она добъетася пробелами, а VARCHAR может, и вроде бы как это стандарт ANSI, и ORACLE его должен поддерживать. Т.е. если заменить твои VARCHAR-ы на CHAR-ы, то пустых строк не будет никогда, и плюс клиентские проги обычно не отличают CHAR от VARCHAR.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Пустые строки в Oracle и MS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]