Пустые строки в Oracle и MS
От: kto-to  
Дата: 17.08.04 13:30
Оценка:
Есть уйма софта, которая через 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 настроить так,
чтобы он на своем уровне пустые строки заменял пробелами
при передаче параметров от клиента к серверу?

Т.е. на клиенте я вызываю хранимую процедуру
со строковым параметром равным пустой строке,
а на сервак на месте этого параметра приходит пробел.
Re: Пустые строки в Oracle и MS
От: Степанов Андрей  
Дата: 17.08.04 13:35
Оценка:
Здравствуйте, kto-to, Вы писали:



KT>в MS условие '' ='' — истинно, a ''=null -ложно

KT>в оракле условие '' ='' — ЛОЖНО, a ''=null -ложно


Классическая ошибка. "= null" НЕ ЯВЛЯТЕСЯ ЛОЖНЫМ в Оракле! Впрочем, не является и истинным. Оно является NULL

Чтобы null былио равны придется делать либо

select * from some_table where a = b or ( a is null and b is null )


либо

select * from some_table where nvl(a,-1.2345) = nvl(b,-1.2345)
Re: Пустые строки в Oracle и MS
От: mekanik  
Дата: 17.08.04 13:38
Оценка:
Здравствуйте, kto-to, Вы писали:

KT>Проблема №1:


KT>в MS условие '' ='' — истинно, a ''=null -ложно

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

KT>Возможно ли так настроить оракл?

KT>(Чтобы работало Select * from table where field ='')

RTRIM(field) = RTRIM('') -- справа не нужно, все равно пустая строка
RTRIM "съедает" справа в данном случае пробелы, а вообще можно указать вторым параметром, строку, содержащую символы, которые надо удалить.
Re: Пустые строки в Oracle и MS
От: Softwarer http://softwarer.ru
Дата: 18.08.04 06:57
Оценка: +1
Здравствуйте, kto-to, Вы писали:

KT>Есть уйма софта, которая через OLEDB.ADO ломится на MSSQL.

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

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

Я бы в первую очередь вставил некий промежуточный уровень между системой и сервером; в частности, он отрабатывал бы эти инсерты, удаляя "лишние" поля. На дельфе это сделать легко; как в Вашем случае — трудно сказать

Что касается нуллов — вопрос к физическому смыслу данных. Если в полях должна лежать пустая строка, и это именно дефолт — правильным будет именно сделать поле нулловским.
Re: Пустые строки в Oracle и MS
От: Аноним  
Дата: 18.08.04 09:50
Оценка:
одеть на все таблицы view с функцией NVL()
Re: Пустые строки в Oracle и MS
От: kto-to  
Дата: 18.08.04 12:16
Оценка:
Народ, не в этом была суть моего вопоса

старое приложение делает так
1) insert into table(field, pk) value('','pkvalue')
2) здесь, на уровне БД/OLEDB.ADO сейчас ничего не происходит,
а вероятно должно (например тригер или какая-то настройка в OLEDB.ADO)
3)потом старое приложение используя свой старый
код спрашивает
select * from table where field =''
а на выходе должно получить эта строку
(ЭТА ЗАДАЧА ПОХОЖЕ СОВСЕМ НЕРЕАЛЬНАЯ)
4) еще старое приложение используя свой старый
код может спросить
select field from table where pk ='pkvalue'
а на выходе должно получить не нулл,
т.к по нулу станут валиться многие участки кода.

Можно написать тригер before insert for each row,
который будет заменять пустуюстроку на пробел,
но где гарантия, ___что он выполнится саммым первым___,
т.е первее всех других триггеров этого типа.

Кроме того это решение мне не нравится по 2-м причинам:
1-главная) практически накаждую из 1000 таблиц будет такой триггер
2) в ms 'a'+field+'b' и в оракле 'a'||field||'b' дадут разные результаты
Re[2]: Пустые строки в Oracle и MS
От: kto-to  
Дата: 18.08.04 12:26
Оценка:
Здравствуйте, Softwarer, Вы писали:

KT>>Есть уйма софта, которая через OLEDB.ADO ломится на MSSQL.

KT>>Меняем МSSQL на ORACLE.
S>Есть впечатление, что Вы хотите парой волшебных движений за час перевести систему с сервера на сервер. Думаю, это не удастся; при всех оптимизациях это серьезная работа (не говоря уже о необходимости полного тестирования).
С этим никто не спорит!
Но хотелось бы по максимуму облегчить задачу программерам
+ побыстрее получить достаточно функциональную альфа версию

S>Я бы в первую очередь вставил некий промежуточный уровень между системой и сервером; в частности, он отрабатывал бы эти инсерты, удаляя "лишние" поля. На дельфе это сделать легко; как в Вашем случае — трудно сказать

этот промежуточный уровень уже есть OLEDB.ADO

S>Что касается нуллов — вопрос к физическому смыслу данных.

Вопрос не в нулах а комплексном решении проблемы.
Re[3]: Пустые строки в Oracle и MS
От: Softwarer http://softwarer.ru
Дата: 18.08.04 12:45
Оценка: +1
Здравствуйте, kto-to, Вы писали:

KT>Но хотелось бы по максимуму облегчить задачу программерам

KT>+ побыстрее получить достаточно функциональную альфа версию

А в чем цель? Когда стоит такая задача — обычно уже есть готовая система, то есть уже первая версия должна быть надежной (чтобы на нее можно было перенести реальную базу).

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

Скажу сразу, "настройку" типа запрошенной Вами я к решениям не отношу — даже если оно возможно. Инструментом надо пользоваться в соостветствии с его правилами, иначе не имеет смысл переходить. От "глупостей", унаследованных исстари таким образом, потом избавиться практически невозможно.

Решений имхо есть две категории. Во-первых — некий стандартный код. Скажем, если у вас в приложениях повсеместно используется класс, допустим, ADOQuery — я бы начал с того, что унаследовал от него свой в точности такой же класс и везде в приложениях заменил бы один на другой. Далее, все что можно, я бы решал на уровне этого наследника — скажем, в том же случае пустых строк в инсерте я бы на уровне этого наследника модифицировал insert, и одновременно писал бы диагностику программистам — мол, еще вот здесь надо поправить. Таким образом, сначала все работало бы, а постепенно можно будет исправить все такие места и после этого выкинуть эту некрасивую вставку из своего класса.

Во-вторых — формализованное действие, которое должны сделать программисты "во всех местах, где". Тут главное — найти все такие места. Опять же: потребуется проверить все SQL-и, чтобы в них не было того же "равно пустой строке" в where. Тут, например, на уровне того же класса запроса можно отлавливать такую строку и давать задание программистам — исправить.

KT>этот промежуточный уровень уже есть OLEDB.ADO


Это провайдер, вмешаться в работу которого вряд ли возможно (хотя я не знаю ADO — может, и позволит). А нужен — логический уровень, уровень абстракции, который поможет Вам аккуратно перейти.

P.S. На самом деле у меня есть мнение, что такой уровень имеет смысл закладывать всегда — вплоть до того, что при разработке приложения сразу делать свои тривиальные обертки вокруг любых используемых классов. Правда, сам я так не делаю — пока что достаточно легко добавить такой тривиальный класс, когда в нем возникает необходимость.

S>>Что касается нуллов — вопрос к физическому смыслу данных.

KT>Вопрос не в нулах а комплексном решении проблемы.

Комплексного решения здесь, насколько я в курсе, нет. И это, пожалуй, к лучшему — не знаю кто как, а лично я очень не люблю "переключателей логики".
Re[4]: Пустые строки в Oracle и MS
От: kto-to  
Дата: 19.08.04 12:04
Оценка:
Просмотрите статью "Пустые строки в Oracle и MS"
в форуме "проектирование БД"
http://sql.ru/forum/actualthread.aspx?bid=36&tid=115282
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.