Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
Пустые строки в 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 настроить так, чтобы он на своем уровне пустые строки заменял пробелами при передаче параметров от клиента к серверу? Т.е. на клиенте я вызываю хранимую процедуру со строковым параметром равным пустой строке, а на сервак на месте этого параметра приходит пробел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 17:47 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
В Оракле строка нулевой длинны и null - эквивалентные понятия. kto-toМне необходимо, чтобы оракл считал пустые строки "равным" пробелу, а пробел равным пустой строке Нет, нельзя. kto-toДежурное решение - разрешить туда писать null. Почему дежурное решение ? Просто разрешить хранить null и переписывать все модули, ориентированные, что там может быть то-ли значение, то-ли пробел. Да, это довольно корявая придумка Оракла, и почему разработчики этой СУБД приняли решение считать строку нулевой длинны эвивалентным null извесно только им одним. Более того, в документации написано, что нет никакой гарантии, что такая постановка в следующих версиях сохранится. Пока что и в девятке и в десятке строка нулевой длинны эквивалентна null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 18:14 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
zayacВ Оракле строка нулевой длинны и null - эквивалентные понятия. Это я знал, но надеюсь(-лся), что возможно существует хитрая настройка, которая этим управляет. Меня в частности интересует Oracle9. zayac Почему дежурное решение ? Просто разрешить хранить null и переписывать все модули, ориентированные, что там может быть то-ли значение, то-ли пробел. Там более 30 человеколет кода, написанного в разное время. Часть его еще работала с настольными базами. И по-моему программеры не очень любят, когда вместо какого-то (не null ) значения им приходит null. Кроме того я совсем не уверен, что там стоят програмные проверки на null, учитывая что на многих колонках сейчас ЯВНО стоит NOT NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 15:49 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
У меня есть вопрос почти в тему. Вроде как в индексы у Оракла NULL значения не включаются. как быть, если допустим нужно из таблицы выбрать все значения где somefield is null, и их ну, допустип 2% от всего количества строк. Будет ли использоваться в этом случае индекс по этому полю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 16:28 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
Вы мне кажется не в тот форум залезли, идите в Oracle Кстати, а по-моему очень класно, что строка нулевой длинны равна НУЛУ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 17:58 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
Я с этим столкнулся, когда разработчик захотел перенести в оракловые пакеты несколько десятков функций из си. Конечно их необходимо было серьезно переписывать, но хотелось оставить основную идею: функция ищет что-то там и если находит - возвращает в виде строки, если не находит - возвращает пустую строку. Возврат NULLа - это нестандартная ситуация (с точки зрения си, по крайней мере) и ее надо обрабатывать отдельно. А тут оказывается что их уравняли. basКстати, а по-моему очень класно, что строка нулевой длинны равна НУЛУ. А что в этом хорошего ? Как заметил gardenman, NULLы не хранятся в индексе, соответственно при условии IS NULL индекс не используется, то что при проэктировании базы это надо учитывать, чтобы не приходилось по многомиллионной таблице искать по такому условию - это уже другой вопрос; NULL не имеет типа - в операциях с различными типами он интерпретируется по разному Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Я совсем не против чтобы "считать строку нулевой длинны NULLом или нет" было параметром, даже пусть параметром который можно установить только при создании базы (например кодировка), но только чтобы такой параметр был. А есть вообще какие-то языки програмирования или СУБД, которые как и Оракл интерпретировали бы строку нулевой длинны и null - как эквивалентные понятия ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 21:17 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
Тоже интересная тема. Возьмем простейший тип CHAR(10) если мы вставим в поле '12345' то как правило в селекте в этом поле все равно получим '12345_____', значение дополнится пробелами, если это у нас VARCHAR - на выходе получим то, что вставили - '12345', по идее тогда вставив '' мы должны получить '__________' в случае CHAR и '' в случае VARCHAR. Но никак не NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 10:27 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
ИТАК: на уровне оракла они непобедимы. У меня есть такие варианты. 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). Может я что-то упустил? Ваши мнения/соображения по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 15:59 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
basКстати, а по-моему очень класно, что строка нулевой длинны равна НУЛУ. Можно услышать аргументы? Вроде как только пару дней назад в форуме оракла сошлись на том, что именно это и неклассно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 16:19 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
zayacЯ совсем не против чтобы "считать строку нулевой длинны NULLом или нет" было параметром, даже пусть параметром который можно установить только при создании базы Нет. Вот параметр - намного хуже, чем выбрать любую линию поведения. Подобные переключатели логики приводят к огромным трудностям в поддержке и сопровождении. Простой пример - в Delphi есть среди прочего такой переключатель $H, в зависимости от которого тип string трактуется как либо AnsiString, либо ShortString. Ситуация с этими двумя типами - примерно как с нуллом; и там, и там свои особенности. Мне пришлось возиться с поддержкой большого и отвратительно написанного программного комплекса. Помимо ошибок, проистекавших из этого, у него была замечательная особенность - ряд модулей требовали компиляции в одном из этих режимов, ряд - компиляции в том же режиме, что и некий другой (вызывающий их) модуль, а два-три самых интересных - должны были компилиться в том или ином режиме в зависимости от приложения, которое их использовало. Представляешь, как офигенно удобно было с этим работать? В частности, собрать проект целиком можно было только убивая после каждой компиляции объектные файлы - чтобы при следующей они откомпилировались в другом режиме, нужном следующему компилируемому куску кода. Впрочем, можно найти пример ближе. Представь себе, насколько с таким переключателем станет удобнее отвечать на вопросы типа "как написать запрос", "почему не работает".. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 16:26 |
|
||
|
Пустые строки в Oracle и MS
|
|||
|---|---|---|---|
|
#18+
Извините, немного позновато и, возможно, бесполезно практически. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2004, 13:18 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32655521&tid=1546315]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 394ms |

| 0 / 0 |
