|
|
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Может конечно глупый вопрос, но ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. при первом чтении возвращается 0, при втором - реальное количество строк с null значениями Для insert, update setNull отрабатывает нормально поиски по докам и интернету не привели к видимому результату во всех источниках нет нигде явного упомининия о неработе с select есть какие-то решение для связки null параметров без синтаксического анализа текста запроса и замены "= Null " на "is null"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:02:00 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Можно попробовать что-то вроде: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:28:58 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
select count(*) from tbl where col = null Ничего не вернет, т.к. сравнение с null таким образом запрещено, точнее неопределено ( в зависимоcти от реализации СУБД реакция может теоретически быть вообще любая). В переводе на язык базы вы просите ее сравнить что-то конкретное с чем-то вообще неизвестным, например, 1> неизестно чего, 1< неизестно чего, 1==неизвестно чему? Или null==null? А фиг его знает, что в реальности скрывается за первым неизвестно чем и вторым неизвестно чем. :) Вот именно для того, чтобы вы могли объяснить, что сравнивать ничего не надо, а надо просто выбрать ряды с неизвестным значением и введено is null. "поиски по докам и интернету не привели к видимому результату" Если открыть любую самую примитивную книжку по СУБД этот нюанс расписывается самыми жирными буквами. Не надо было просто использовать в поиске слова типа JAVA, т.к. это к ней не имеет никакого отношения. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:36:31 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
так вобщем-то сейчас и поступаю, но это в каждом конкретном случае надо делать предположения о том, "а может ли здесь быть NULL" (а не хочется так), да и планы выполнения запросов может отчасти портить я сделал обертку на setXXX, setNull, в которой проверяю значение параметра и не думая больше о параметрах вызываю ее а получается, что SELECT чем-то оказался обижен в JDBC но вроде и в ODAC это наблюдается вот только пока не могу понять, отчего оно так пытаюсь найти решение без переписи запросов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:36:39 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Дм.Смирнов wrote: > да и планы выполнения запросов может отчасти портить Индекс по функции может спасти. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:41:41 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Дм.Смирнова получается, что SELECT чем-то оказался обижен в JDBC В каком смысле "обижен"? Нельзя через JDBC сделать что-то, что не поддерживается непосредственно в SQL. Логично, разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:41:48 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
автори введено is null про "=NULL" и "IS NULL" понимаю сам иногда кому-нибудь рассказываю казалось только, что на этапе BIND драйвер (или сервер) мог бы разобрать эту ситуацию и поменять конструкцию на то он и BIND в старой клиентской библиотеке приходилось делать синтаксический анализ текста запроса перед посылкой на сервер. Но коряво ведь все это ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:42:35 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Denis PopovМожно попробовать что-то вроде: Код: plaintext 1. 2. 3. Смысл? Ввести в программу неожиданное поведение при возможном изменении структуры таблицы? Замедлить запрос путем вызова функций? Озадачить дальнейших разработчиков "волшебной" цифрой в запросе? Кричать потом на других разработчиков, что "тут вот у меня священное -1, кто покусится убью!"?. чем is null не угодил? Нежеланием проверить аргумент и слегка изменить запрос при null значении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:43:04 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Дм.Смирнов автори введено is null про "=NULL" и "IS NULL" понимаю сам иногда кому-нибудь рассказываю казалось только, что на этапе BIND драйвер (или сервер) мог бы разобрать эту ситуацию и поменять конструкцию на то он и BIND в старой клиентской библиотеке приходилось делать синтаксический анализ текста запроса перед посылкой на сервер. Но коряво ведь все это Коряво, если JDBC драйвер будет соглашаться принимать кривой запрос и "исправлять" его по собственному усмотрению. Вы же сами потом будете говорить, про кривой драйвер, который "вещь в себе", а он, бедняга, просто решил "додумать" за вас еще пару вещей, ну там хинт оптимизатору подсунуть , еще чего "по-мелочи". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:46:17 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
carper wrote: > Нежеланием проверить аргумент и слегка изменить запрос при null значении? Думаю, невозможностью или затруднительностью менять запрос при null значении. Например, когда он - запрос - довольно сложен и/или пришел со стороны. "Священное" число можно не пускать ограничением в БД. Функция - да, будет, но и индекс тоже. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:55:00 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
автор"исправлять" его по собственному усмотрению ну на то есть документация в том виде, в котором сейчас есть - то же мало приятного что хочется: 1. сделать PreparedStatement 2. пол лимона раз сделать Bind/Execute а так пока варианты: 1. держать по несколько парсенных курсоров (если есть null, если нет Null). А если полей несколько в запросе? 2. Править запрос, добавля туда nvl() на все подозрительные поля 3. каждый раз делать анализ запроса и полность гонять цикл: prepare-bind-execute ни один из них не кажется красивым неужели остается только выбырать из нескольких зол меньшее и красивых решений здесь не существует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:55:07 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Дм.Смирнов... неужели остается только выбырать из нескольких зол меньшее и красивых решений здесь не существует? Избавиться от NULL-значений в таблицах :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 19:16:59 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Дм.Смирнов неужели остается только выбырать из нескольких зол меньшее и красивых решений здесь не существует? Существует, боюсь только, что вы меня за это побьете. :) Красивое и правильное решение это понять, что NULL значение это не нечто мешающее, а одно из правил бизнес-логики, которое не надо прятать, а надо разобраться верна ли такая логика, если да (что крайне маловероятно), то это должно найти полноценное отражение в коде. А попытка "замаскировать" запрос nvl функцией приведет к тому, что мы вытянем хвост - решим вопрос с парсингом, зато увязнем голову - даже когда нет NULL по своей собственной воле получаем наихудшую производительность. Наименее "кровавый" вариант, уже предложили - если у вас предполагается частое обращение к таблице с null величинами, то стоит задуматься о том чтобы их убрать уже в самой таблице. Если у вас философский смысл понятия того, что значение "не определено", действительно имеет смысл, то это кривой вариант, т.к. невольно вовлекает человеческий фактор, но из всех неверных самый верный. :) И убрать null правильнее именно на уровне таблицы, а не JAVA кода или драйвера. Если, по-каким либо причинам, вы не можете менять таблицу, то можно менять код приложения, но ни в коем случае не следует менять под эту задачу драйвер. Кстати, исходя из теории парадоксального мышления, покопайтесь в последних версиях драйверов, высока вероятность. что уже нашелся "умник", который "облегчил" вам жизнь и таки засандалил такую возможность на уровне драйвера (не обольщайтесь, если найдете, СУБД пофигу ваш драйвер, просто в этом варианте она будет тормозить уже по его вине :( ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 11:06:11 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
авторСуществует, боюсь только, что вы меня за это побьете. :) да нет же :) интересуют все мнения зачастую null значения очень даже полезны и убирать их не хочется (или маскировать dummy-значениями) к примеру хранение набора полей: фамилия, имя, отчество или: id улицы, №дома, корпус был опыт работы в старой версии системы, где как раз и осуществлялась поппытка уйти полностью от null полей. И там, к примеру, значение корпуса здания, если оно не указано, проставлялось как "-1". Что из этого получилось: решили проблемы в БД, сделали проблемы клиенту в виде непонятных "-1", там где разработчик забыл сделать обработку магического числа "-1". А приходят новые люди, и этого естественно не знают. Со временем в системе накапливается СТОЛЬКО неявных зверей, подобных "если ... то ..." (на разных уровнях системы), то становится как-то старшно за масштабируемость и безглючность Вот и получается, что в одном месте деалем красиво, в другом - сложности. Хотелось найти решение, при котором разработчик со стороны клиента при виде поля не должен задаваться мыслью, "а надо ли мне именно для этого поля что-то еще дополнительно сделать, что бы не вылезло какой-нибудь ерунды у заказчика" Или, с другой стороны, разработчик БД/клиента при написании запроса/ХП не должен задумываться о том, а допустимо ли здесь null-значение и надо ли сделать опыть же какие-то телодвижения. Задание ограничений NULL/NOT_NULL не всегда подходит из-за частой смены требований к сущностям автоматизации Получается очень много мест, в которых надо о чем-то помнить. Похоже, что это вопрос уже не технический, а больше организационно-проектировочный: как сделано? кто должен помнить о том, что сделано? кто кому должен доносить информацию о том как надо делать? А технические решения есть Null, нет Null не сильно отличаются друг от друга автор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 11:27:48 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Дм.Смирнов Похоже, что это вопрос уже не технический, а больше организационно-проектировочный: как сделано? кто должен помнить о том, что сделано? кто кому должен доносить информацию о том как надо делать? А технические решения есть Null, нет Null не сильно отличаются друг от друга Совершенно верно, это вопрос реализации бизнес-логики. Можно обойти ее на кривой кобыле, но потом, вы сами все верно описали, что вылезает. Поскольку первичен потребитель, а не исполнитель, то я бы рекомендовал решать каждую проблему индивидуально и, ни в коем случае не идти по пути превращения всего и вся в метаобъекты с реализацией наихудшего по производительности, зато "универсального", варианта. Все эти nvl надо не надо и т.п. до добра не доведут и, в конечном итоге, загрузят базу больше чем повторные разборы. А что бывает при замене значимых null на "умолчания" вы и сами все прекрасно описали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 12:43:22 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
большое спасибо всем участникам дискуссии буду думать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 12:51:33 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
Denis PopovМожно попробовать что-то вроде: Код: plaintext 1. 2. 3. А чтобы не думать какого-же "точно не будет среди значений": Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 16:31:13 |
|
||
|
JDBC: setNull не катит для SELECT?
|
|||
|---|---|---|---|
|
#18+
TiG А чтобы не думать какого-же "точно не будет среди значений": Код: plaintext 1. Да, только переменные двоятся, может полететь весь порядок при их привязке. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 16:45:17 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2146684]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
75ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 275ms |
| total: | 460ms |

| 0 / 0 |
