Оракл...disrespect-ы
Один из аргументов: Оракл считает ""(пустую строку) нуллом. Очень интересно смотеть, как код, до этого отлично работавший, начинает все время бросать NullReferenceException.
нефик на оракл наезжать
а ты уверен что у тебя в поле записана именно пустая строка?
Думаю, практически все большие коммерческие проекты такие. Кроме Windows.
на один скрипт Оракл 9 выдает сообщение об ошибке, что идентификатор слишком длинный, при этом он ссылается на идентификатор, длина которого не превышает 40 символов — как решить проблему?

раз сцылга
два сцылка
Инересно, тот, кто принял такое проектное решения был вменям...

и ваще я все такие запросы как правило выношу в хранимки
Инересно, тот, кто принял такое проектное решения был вменям...Да, но только по вторникам

а ваще это реально пиздец. какое решение?

какое решение?Перефразируя известный анекдот про "а где же альтернатива?", решение — MS SQL Server
А чего плохого то?
на один скрипт Оракл 9 выдает сообщение об ошибке, что идентификатор слишком длинный, при этом он ссылается на идентификатор, длина которого не превышает 40 символов — как решить проблему?максимум - не 40 символов, а 30.
1. Names must be from 1 to 30 bytes long with these exceptions:
* Names of databases are limited to 8 bytes.
* Names of database links can be as long as 128 bytes.
а вообще конечно зря я отметился в этом треде, автор которого... как бы это помягче сказать... has a different background.
максимум - не 40 символов, а 30.Кстатит да. Откуда это в 21 веке сии ограничения? как бы это помягче сказать... неособо удобные...
Names of databases are limited to 8 bytes.про это я вообще молчу. ДОС напоминает.
Почему то МССКЛ, который так любят пообсирать ораклисты, дает более широкие возможности именования.
2Счетчик: почему плох нулл в данном случае:
1) У меня в схеме часть строковых полей помечены как недопускающие нулл. Соответственно, когда я начал грузить данные в ораклиную базу, полетели эксепшены.
2) Чтобы пофиксить проблему 1го пункта, разрешаем нуллы. Т.к. они были ранее помечены ненулевыми на уровне базы, то код, работающий с полями, не проверял их на нулльность. Опять же получаем эксепшны в отлаженном коде. Приходится его править и вставлять проверки. Вообще говоря - нулл это не очень хорошо, т.к. это частный случай из-за которого код загромождается условными операторами, что повышает его объем и ухудшает читабельность.
3)Нулл и "" - это разные всетаки концептуально вещи. Нулл - нет значения, на уровне бизнес-логики может значит, к примеру, что пользователь его не вводил. "" - значение есть, пользователь с ним работал.
если ты собирался писать под оракл, значит ты сначала должен был изучить его особенности, а потом уже писать свой код
3)Нулл и "" - это разные всетаки концептуально вещи. Нулл - нет значения, на уровне бизнес-логики может значит, к примеру, что пользователь его не вводил. "" - значение есть, пользователь с ним работал.Ок. Допустим пользователь редактирует поле, которое в базе будет храниться как Number. Поредактировал и все стер, сохранил. Что должно быть, концептуально, в базе? Специальный '' типа number?
Я не хочу сказать, что Null - это удобно, я к вопросу о концептуальности.
И насчет особенностей... я конечно понимаю, что это слабый аргумент, но и в программировании есть "общепринятые вещи", которые соблюдаются в различных системах разработки. Оракл почему то сильно выделяется, я бы сказал, не самыми интуитивными решениями.
2Бутчер: Для чисел такого естественно нет

Оракл почему то сильно выделяется, я бы сказал, не самыми интуитивными решениями.этим все СУБД страдают
вроде стандарт SQL-92 (т.е. аж 92 года!) ни одна СУБД не соблюдает
этим все СУБД страдаютТы меня не понял. Я не про несоблюдение стандарта, а про то, что система должна быть интуитивно понятной, и соблюдать общие правила. Чтобы человек, начинающий с ней работать мог использовать предыдущий опыт, а существующий код, не приходилось перелопачивать.
вроде стандарт SQL-92 (т.е. аж 92 года!) ни одна СУБД не соблюдает
Кстатит да. Откуда это в 21 веке сии ограничения? как бы это помягче сказать... неособо удобные...Тебе не хватает 8 символов для имени базы? Можно поинтересоваться, а сколько же у тебя ораклиных баз?
Names of databases are limited to 8 bytes.
про это я вообще молчу. ДОС напоминает.
Почему то МССКЛ, который так любят пообсирать ораклисты, дает более широкие возможности именования.

Насчёт 30 символов - упирался в это ограничение только когда автоматически генерил имена для индексов из имен полей. А для удобочитаемости больше 30 символов по-моему вредно.
P.S. MS SQL не работает на всех основных платформах кроме одной. Какая же это к чёрту СУБД?
Ты меня не понял. Я не про несоблюдение стандарта, а про то, что система должна быть интуитивно понятной, и соблюдать общие правила. Чтобы человек, начинающий с ней работать мог использовать предыдущий опыт, а существующий код, не приходилось перелопачивать.все таки не соглашусь
во-первых интуитивно как раз понятно, что NULL это пустая строка
во-вторых про какой предыдущий опыт ты говоришь? если про опыт работы с предыдущей версией оракл, то там тоже так же было
если про опыт работы с другой СУБД, то это уже холивор: вот в опере встроен rss ридер, а в лису нет, поэтому лиса остой
если про опыт работы с другими языками программирования, т.е. не SQL, то тоже бред, SQL ничего общего с языками программирования не имеет
ты еще спроси почему в чистом HTML нету циклов, а приходится каждый раз кучу <tr><td> писать
Насчёт 30 символов - упирался в это ограничение только когда автоматически генерил имена для индексов из имен полей. А для удобочитаемости больше 30 символов по-моему вредно.вот-вот, именно такой случай, имена для ряда атрибутов генеряться, код портируется с ms sql
можно как-то снять это ограничение?
во-первых интуитивно как раз понятно, что NULL это пустая строкавсегда казалось, что NULL принято считать как неопределенное значение, в то время как пустая строка вполне определенное значение
можно как-то снять это ограничение?нельзя
во-первых интуитивно как раз понятно, что NULL это пустая строканет. Покажи мне хоть один язык современный, где это было бы так. Данное отличае достаточно серъезно бъет по коду, в отличае от присутствия/отстуствия рсс ридера. Категории просто разные. Ридер - это дополнительная "вкусная" фишка. Аналогию можно проводить с возможностью скажем, уведомления по емэйлу об изменениях в табличках. Нету у меня фишки - можно самому дореализовать.
А трактовка типов - это основы, на которые многое завязано. И изменить тут ничего нельзя.
если про опыт работы с другими языками программирования, т.е. не SQL, то тоже бред, SQL ничего общего с языками программирования не имеет
ты еще спроси почему в чистом HTML нету циклов, а приходится каждый раз кучу <tr><td> писать
И тут имхо ты несовсем прав, тот же PL/Sql - полноценный язык программирования.
Тут можно конечно несоглашостья, однако те СУБД, которые более интуитивны и не выбиваются из общей канвы, способны серъезно сократить время и сложность разработки
всегда казалось, что NULL принято считать как неопределенное значение, в то время как пустая строка вполне определенное значениеопять двадцать пять
это вам казалось с точки зрения вашего языка программирования
NULL в языке рограммирование - это несуществующая ссылка, пустая строка - это уже конкретный объект
NULL в базах данных - это отсутствие данных
пустая строка - это и есть отсутствие данных
база данных не оперирует объектами или ссылками на них, она оперирует только данными
базы данных изначально и придумывались чтобы в шкафах не хранить кучу бумаг
а на бумаге как раз так и есть: или черным по белому записаны данные (например отчество сотрудника) или не записаны, третьего не дано
всегда казалось, что NULL принято считать как неопределенное значение, в то время как пустая строка вполне определенное значениея это уже не раз писал.


базы данных изначально и придумывались чтобы в шкафах не хранить кучу бумаг
а на бумаге как раз так и есть: или черным по белому записаны данные (например отчество сотрудника) или не записаны, третьего не дано
Так вот. Сейчас уже 21 век и база данных уже давно не шкаф, а умное хранилище данных, потребителем которых является программа на традиционном языке программирования. Это стоит усвоить.
NULL в базах данных - это отсутствие данныхпричем здесь объекты и ссылки? про NULL — есть же какие-то стандарты, например, SQL-92: там как с этим?
пустая строка - это и есть отсутствие данных
база данных не оперирует объектами или ссылками на них, она оперирует только данными
причем здесь объекты и ссылки? про NULL — есть же какие-то стандарты, например, SQL-92: там как с этим?в стандарте SQL-92 в натуре NULL и '' разные вещи
но мы вернулись к тому с чего начинали
если вы ругаете что оракл не поддерживает стандарт SQL-92, то я вам уже ответил: токо одна субд полностью поддеривает SQL-92
я так понимаю
изначально субд не создавались для языков программирования, ну или создавались но не для си-подобных языков
поэтому в оракле такую фигню и сделали
а потом поменять не захотели
в 92 году естессно уже все понимали что SQL вызываться будет в 99% случаев из программ, и там равенство null и '' будет неудобно
а оракл так и остался с досадным рудиментом

92 году естессно уже все понимали что SQL вызываться будет в 99% случаев из программ, и там равенство null и '' будет неудобновот именно
а оракл так и остался с досадным рудиментом

вот именно Не ждал я такого от "лучшей промышленной СУБД"это еще ерунда
вот например всякие left,right join
мало того, что это в оракле появилось только в 9 версии, дык оно с кучей багов
и вроде все баги связанные с этим исправлены токо в 10 (да и то не в первом выпуске а в последующих патчах)
NULL в базах данных - это отсутствие данныхимхо, фигню говоришь
пустая строка - это и есть отсутствие данных
вот такой код:
'1'+''+'2'
должен выдавать строку '12' на любом языке
насколько я понял, oracle в этом случае выдаст null
соотвественно более сложный пример
string a: not null
string b: not null
string c: not null
d = a + b + c;
в данном примере, в d мы должны получить нормальную конкатенацию всех строк, соответственно, если b - пустая строка ('' то должны получить просто a+c
в oracle придется делать что-то типа:
if(a is null)
if( b is null)
return c;
else if (c is null)
return b;
else
return b+c;
else
if (b is null)
if (c is null)
return a;
else
return a+c;
else if (c is null)
return a+b;
else
a+b+c;
я нигде не ошибся?
а '1'||NULL||'2' выдаст '12',
а то,что ты написал это уже численные операции и в данном контексте это,помоему, и должен быть NULL
т.е. Null для строк ведет себя не как NULL для других типов?
'1'||''||'2'
а какие другие типы ты конкатенируешь? и как?
Да, и вложенные if-ы конечно писать не надо. Есть стандартные функции nvl, nvl2 - они тоже не всегда красиво выглядят, но тем не менее.
каждый if-ы просто заменится на вызов nvl, но вложенность и большое кол-во вариантов никуда не денется.
В общем так, только пример твой не в тему. Как было уже сказано a||b выдаст нормальный результат и вложенные if-ы не нужны.
так со строками я могу много чего делать, не только их конкатенировать
допустим у меня было выражение:
a || b || c
чтобы посчитать длину
выражение надо уже неочевидным образом переписать в:
notnull(length(a 0) + notnull(length(b 0) + notnull(length(c 0)
найти хвост
tail = substring(s, 0, length(prefix
tail = if prefix is null return s else return substring(s, 0, length(prefix
т.е. получается что любое сложное выражение, которое работает со строками необходимо обрамлять в большую последовательность if-ов.
Не совсем я понял написанное. Но по-моему nvl(length(a||b||c0) должно помочь. Т.е. пример не в тему.
У тебя происходит конкатенация строк. А для того, чтобы посчитать длину, обычно хочется просто сложить несколько чисел. Разница в производительности будет огромной, особенно если строки не состоят из нескольких букв.
конечно поможет, любое выражение можно записать на любом алгоритмически полном языке.
только почему-то все предпочитают писать выражения не на машине тьюринга....
цель хорошего языка программирования - это уменьшить кол-во рассматриваемых вариантов и уменьшить длину записи выражений
обсуждаемое правило поведение oracle-а, наоборот, увеличивает кол-во рассматриваемых вариантов и увеличивает длину записи выражений
ps
> Но по-моему nvl(length(a||b||c0) должно помочь.
так такой переход надо специально делать.
было выражение a||b||c
дальше надо посчитать длину получаем
lenA + lenB + lenC
дальше
lenA + notnull(length(b 0) + lenC
lenA + notnull(length(b 0) + notnull(length(c 0)
т.е. приходится простые переходы (простые рефакторинги) заменять на сложные, в которых приходится анализировать неочевидное поведение выражения
обсуждаемое правило поведение oracle-а, наоборот, увеличивает кол-во рассматриваемых вариантов и увеличивает длину записи выраженийА чего ты ожидал от таких устаревших технологий, как РСУБД и SQL?

У всех реализаций какие-нибудь древние косяки, да есть.
to : Да не вопрос. Только бдеть о производительности нужно гораздо реже чем не бдеть

to : уже есть адекватная замена этим вещам?
to : уже есть адекватная замена этим вещам?адекватная чему?
в смысле buzzword compliance - есть xml native базы
to : Да не вопрос. Только бдеть о производительности нужно гораздо реже чем не бдеть
Пусть у нас строки длиной в сто символов, а операция вычисления суммы строк частая. Это значит, что твой метод будет в сто раз медленнее, чем мог бы быть. Из, значит, для обеспечения той же производительности надо будет покупать сервер в 100 раз быстрее (и в 1000 раз дороже). Это круто?
Твои умозрительные построения от лукавого. И руководствоваться ими при написании кода не стоит. Будут проблемы с производительностью, найдешь узкие места, поправишь код в этих местах. А делать это априори не стоит.
Рассуждение же о том, что раньше времени о производительности думать не надо, применимо к содержательной части приложения, которая может очень сильно меняться за время разработки и, в отличие от библиотечных вещей, не может быть решена заранее.
применимо к содержательной части приложения, которая может очень сильно меняться за время разработки и,Это одна из причин. Другая причина в том, что ты не можешь наверняка знать того, как что будет выполняться в таких то условиях. Точный критерий - конечный результат. Он применим как к "содержательной части", так и библиотечной.
Другая причина в том, что ты не можешь наверняка знать того, как что будет выполняться в таких то условиях. Точный критерий - конечный результат. Он применим как к "содержательной части", так и библиотечной.
Фраза хороша, и я с ней согласен. Но в приложении к конкретной задаче вычисления суммарной длины строк легко видеть, что при любом раскладе производительность варианта без конкатенации выше, т.е. конечный результат будет по крайней мере не хуже. Стоимость его реализации чуть выше, но, как я уже говорил, на то она и библиотечная вещь, чтобы ее уже реализовали где-то еще.
declare
v_Length number;
begin
dbms_output.put_line(to_char(sysdate, 'MI:SS';
for idx in 1..9000000
loop
v_Length := length('прусь' || 'от квашенных ' || 'сисек');
-- v_Length := length('прусь')+length('от квашенных ')+length('сисек');
end loop;
dbms_output.put_line(to_char(sysdate, 'MI:SS';
end;
время: ~11сек.
Вариант 2:
declare
v_Length number;
begin
dbms_output.put_line(to_char(sysdate, 'MI:SS';
for idx in 1..9000000
loop
-- v_Length := length('прусь' || 'от квашенных ' || 'сисек');
v_Length := length('прусь')+length('от квашенных ')+length('сисек');
end loop;
dbms_output.put_line(to_char(sysdate, 'MI:SS';
end;
время: ~ 16сек.
или не то имелось ввиду?
вот такой код: '1'+''+'2'нет
должен выдавать строку '12' на любом языке
насколько я понял, oracle в этом случае выдаст null
ты понял неправильно
во-первых, сложить строки нельзя, их можно только конкатенировать
конкатенация налла - тоесть конкатенация пустого места - это вполне адекватная операция и налл она никак не вернет
во-вторых
правило точно звучит так
1) пустая строка типа VARCHAR является NULL
2) '' не является NULL
более подробно тут
развели целый тред из-за того что кто-то кривыми руками попытался работать с тем, чего не знает, а в документацию заглянуть ему, видимо, религия не позволяет.
соответственно, в первом примере на этапе исполнения строка v_Length := length('прусь' || 'от квашенных ' || 'сисек'); будет выполняться как v_Length := length('прусьот квашенных сисек');
вообще, не понятно, почему обе программы не выполняются 0 сек., ведь v_Length потом нигде не используется... видимо, оптимизатор совсем слаб...
развели целый тред из-за того что кто-то кривыми руками попытался работать с тем, чего не знает, а в документацию заглянуть ему, видимо, религия не позволяет.Ситуацию у автора темы другая. Была программа, которая отлично работала с ms sql. Затем потребовалась поддержка и Oracle-овой базы. При миграции на Oracle неожиданно (да, здесь автор темы не знал о том, что такая фигня) выяснилось, что пустая строка и null — это одно и то же. Заранее этого спрогнозировать было нельзя, т.к. и в стандарте и в ряде других БД такого нет. Вывод: портировать на Oracle дороже, чем хотелось бы. Недовольство именно этим пунктом и высказал автор темы.
видимо, оптимизатор совсем слаб...а кто будет оптимизировать устаревшие технологии, если можно продвигать новые?
сейчас оракл любит яву
О сколько нам мгновений чудных
Готовит просвещенья дух
И опыт, сын ошибок трудных,
И гений пародоксов друг.
А.С Пушкин
а кто будет оптимизировать устаревшие технологии, если можно продвигать новые?сейчас это, конечно, совсем не нужно
но на рынке oracle уже не первый год...
устаревшие технологии можно было оптимизировать в то время, когда они таковыми не являлись
дык уже не первый год новизна важнее эффективности
по сравнению с явой pl/sql - чудо-эффективная штука
тред из-за того что кто-то кривыми руками попытался работать с тем, чего не знает, а в документацию заглянуть ему, видимо, религия не позволяет.видимо, разрабатывать все же надо так, чтобы люди не лезли на каждый чих в документацию, особенно если есть опыт работы с аналогичными системами.
К примеру, если ты пересядешь с отечественной машины с МКПП на иномарку с МКПП не станешь по другому переключать скорости.
И в данном случае документация спаслабы от неожиданности, но не от правки бизнес-логики. Ее править в любом случае.
при создании приложений базы данных самым важным компонентом программного обеспечения является СУБД.Все СУБД различны и нельзя их считать аналогичными.
...
Странная идея о том, что разработчик приложения баз данных должен быть огражден от СУБД, чрезвычайно живуча. Многие почему-то считают, что разработчикам не следует тратить время на изучение СУБД.
...
Это не критика инструментальных средств или современных технологий, таких как компоненты EJB и поддержка постоянного существования на базе контейнеров. Это — критика намеренного игнорирования особенностей СУБД, принципов ее работы и использования.
Все СУБД различны и нельзя их считать аналогичными.это нормально?
при создании приложений базы данных самым важным компонентом программного обеспечения является СУБД
Это КРАЙНЕ спорное утверждение и с ним еще как можно не соглашаться.
это нормально?да
вполне
если бы все СУБД были одинаковыми, то и выбора бы не было
а стандарты никто не держит никогда, так что это вощемто тоже нормально
например, html&css
ИЕ нифига стандарты не держит, но при этом 80% пользователей инета выбрали ИЕ
жесть
Это КРАЙНЕ спорное утверждение и с ним еще как можно не соглашаться.А что важнее? Application Server? Сравни стоимость лицензий на СУБД и на апп-серверы и сразу станет ясно, что тут более важно, а что - менее.
> при создании приложений базы данных самым важным компонентом программного обеспечения является СУБДЕсли ты хочешь чтобы твой апп-сервер работал на нескольких БД, то тут ты жертвуешь очень сильно производительностью - потому как идеология разная - то что будет быстро в MS SQL Server возможно будет очень медленно в Oracle по ряду причин. Вообщем если б ты не поленился Том Кайта почитать, то думаю бы согласился с ним - он достаточно хорошие аргументы привел.
Это КРАЙНЕ спорное утверждение и с ним еще как можно не соглашаться.
Ксати есть такая шарага в Москве Bank's Soft System (BSS). Одно из направлений у них - по для муниципала - для казначейств в частности. Так вот, там есть такой сервер приложения, который может работать как на SyBase, так и на Oracle. Как он работает рассказать?

Покажи мне хоть один язык современный, где это было бы так
ska:~ gleb$ perl -e 'print "" == NULL'
1
меня угнетает вот такая ситуация:
сначала я делаю
INSERT INTO tbl (str) VALUES (?)
pstmt.setString(1, str);
а потом делаю так:
SELECT * FROM tbl WHERE str = ?
pstmt.setString(1, str);
так вот, если str не дай Бог пустая, то ничего у меня не выйдет.
Что прямо скажем, неколько обескураживает - вот же я эту запись в БД клал строчкой выще, а теперь ее найти не могу ...
Распространение заведомо ложной информации для незнающих perl. Незачот без права пересдачи.
Оставить комментарий
FRider
Страшное говно, а писали его сраные мудаки