Выбор полей null в Oracle
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Выбор полей null в Oracle
В Oracle юзаю форму обновления записи Browse. Одно из полей этой формы пустое, то бишь NULL.
Трассер дает
10361600 Binding field 1 "IP" = 192.168.2.13
10361600 Binding field 2 "OSUSER" = HS_DAV
10361600 Binding field 3 "SCHEMA" = null
10361600 Binding field 4 "SBD" = P27
10361600 Parsing Cursor : SELECT /*+FIRST_ROWS*/ "DATEOVER","NAME","IP","OSUSER","SCHEMA","SBD" FROM PROTECT."VPROTECT_LIST" WHERE "IP"=? AND "OSUSER"=? AND "SCHEMA"=? AND "SBD"=?,
а Oracle такого не понимэ, ему нужно IS NULL, т.е. так:
SELECT /*+FIRST_ROWS*/ "DATEOVER","NAME","IP","OSUSER","SCHEMA","SBD" FROM PROTECT."VPROTECT_LIST" WHERE "IP"=? AND "OSUSER"=? AND "SCHEMA" IS NULL AND "SBD"=?
Смутно помнится мне, что было указание где-то на используемую БД, в зависимости от этого и запросы генерились. Но давно не брал я в руки шашек ...
Clarion 6.3., MAV 1.0. от начала 2010 года.
Трассер дает
10361600 Binding field 1 "IP" = 192.168.2.13
10361600 Binding field 2 "OSUSER" = HS_DAV
10361600 Binding field 3 "SCHEMA" = null
10361600 Binding field 4 "SBD" = P27
10361600 Parsing Cursor : SELECT /*+FIRST_ROWS*/ "DATEOVER","NAME","IP","OSUSER","SCHEMA","SBD" FROM PROTECT."VPROTECT_LIST" WHERE "IP"=? AND "OSUSER"=? AND "SCHEMA"=? AND "SBD"=?,
а Oracle такого не понимэ, ему нужно IS NULL, т.е. так:
SELECT /*+FIRST_ROWS*/ "DATEOVER","NAME","IP","OSUSER","SCHEMA","SBD" FROM PROTECT."VPROTECT_LIST" WHERE "IP"=? AND "OSUSER"=? AND "SCHEMA" IS NULL AND "SBD"=?
Смутно помнится мне, что было указание где-то на используемую БД, в зависимости от этого и запросы генерились. Но давно не брал я в руки шашек ...
Clarion 6.3., MAV 1.0. от начала 2010 года.
Любознательный
Re: Выбор полей null в Oracle
Уточняю. Версия MAV - mav_c63_20100227.
При открытии формы появляется ошибка record not found, поскольку Oracle не может найти
запись по условию = NULL. Ему нужно указывать IS NULL.
В Oracle нельзя сравнивать NULL с чем либо, поскольку его значения неопределено.
По русски это будет пойди не знаю куда, найди не знаю что.
К сожалению, мой первичный ключ содержит набор полей, два из которых могут быть NULL. Первый раз такая ситуация.
При открытии формы появляется ошибка record not found, поскольку Oracle не может найти
запись по условию = NULL. Ему нужно указывать IS NULL.
В Oracle нельзя сравнивать NULL с чем либо, поскольку его значения неопределено.
По русски это будет пойди не знаю куда, найди не знаю что.
К сожалению, мой первичный ключ содержит набор полей, два из которых могут быть NULL. Первый раз такая ситуация.
Любознательный
-
- ✯ Ветеран ✯
- Сообщения: 5025
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 22 раза
Re: Выбор полей null в Oracle
А разве есть SQL сервера, где проходит конструкция "where schema=null"? Сколько их поюзал, такого не встречал.
We are hard at work… for you.
Re: Выбор полей null в Oracle
Каждый сервер БД NULL интерпретирует по разному. Так что вполне возможно.
Любознательный
Re: Выбор полей null в Oracle
AVDU писал(а):В Oracle юзаю форму обновления записи Browse. Одно из полей этой формы пустое, то бишь NULL.
Трассер дает
10361600 Binding field 1 "IP" = 192.168.2.13
10361600 Binding field 2 "OSUSER" = HS_DAV
10361600 Binding field 3 "SCHEMA" = null
10361600 Binding field 4 "SBD" = P27
10361600 Parsing Cursor : SELECT /*+FIRST_ROWS*/ "DATEOVER","NAME","IP","OSUSER","SCHEMA","SBD" FROM PROTECT."VPROTECT_LIST" WHERE "IP"=? AND "OSUSER"=? AND "SCHEMA"=? AND "SBD"=?,
а Oracle такого не понимэ, ему нужно IS NULL, т.е. так:
SELECT /*+FIRST_ROWS*/ "DATEOVER","NAME","IP","OSUSER","SCHEMA","SBD" FROM PROTECT."VPROTECT_LIST" WHERE "IP"=? AND "OSUSER"=? AND "SCHEMA" IS NULL AND "SBD"=?
Смутно помнится мне, что было указание где-то на используемую БД, в зависимости от этого и запросы генерились. Но давно не брал я в руки шашек ...
Clarion 6.3., MAV 1.0. от начала 2010 года.
Код: Выделить всё
sql MAVSelect
Код: Выделить всё
sql.Where(sql.Field(VPROTECT_LIST.SCHEMA) & ' is null')
Код: Выделить всё
sql.Where(VPROTECT_LIST.SCHEMA,'is null')
Re: Выбор полей null в Oracle
Еще бы знать, куда это сунуть, как ни делаю, ничого не выходит,
Андрей, не подскажешь, пожалуйста ?
Андрей, не подскажешь, пожалуйста ?
Любознательный
Re: Выбор полей null в Oracle
AVDU писал(а):Еще бы знать, куда это сунуть, как ни делаю, ничого не выходит,
Андрей, не подскажешь, пожалуйста ?
мне от сюда тоже не видно где и кто генерит данный код - дай хотя бы процедуру .CLW где это происходит
Re: Выбор полей null в Oracle
Вот кусок сурса формы:
Перед MAVGET я попытался вставить SELF.Select.Where(SELF.Select.Field(vprotect_list.schema) & ' is null').
Как я понимаю MAVGET дает запрос по полям первичного ключа, и ему нужно сказать, что бы он генерил не = NULL,
а IS NULL.
Затем то же самое нужно сказать MAVUpdate. И MavDelete.
Вопрос КАК ?
Код: Выделить всё
MAV:Save.PrepareChange PROCEDURE
! Start of "MAV SaveButton"
! [Priority 5000]
! End of "MAV SaveButton"
CODE
! Start of "MAV SaveButton"
! [Priority 4000]
SELF.Select.Where(SELF.Select.Field(vprotect_list.schema) & ' is null');
IF MAVGET(VPROTECT_LIST)
MAVSHOWERROR
RETURN
END
MAVCOPY(SAV1:Rec,VPROTECT_LIST,SIZE(VPROTECT_LIST))
IF SELF.Request = ChangeRecord
SELF.W{PROP:Text} = 'Record will be Changed'
END
! [Priority 9950]
Как я понимаю MAVGET дает запрос по полям первичного ключа, и ему нужно сказать, что бы он генерил не = NULL,
а IS NULL.
Затем то же самое нужно сказать MAVUpdate. И MavDelete.
Вопрос КАК ?
Любознательный
Re: Выбор полей null в Oracle
Похоже, спасение утопающих их собственных рук дело. Мда.
Любознательный
Re: Выбор полей null в Oracle
MAVGET работает по полям первичного ключа, а это означает NOT NULLAVDU писал(а):Похоже, спасение утопающих их собственных рук дело. Мда.
нужно гибкое решение - используй MAVSelect
Код: Выделить всё
sql MAVSelect
Код: Выделить всё
sql.Init(1,1)
sql.BindFields(VPROTECT_LIST)
sql.Where(sql.Field(vprotect_list.schema) & ' is null')
IF sql.Run() or sql.Fetch()
MAVSHOWERROR
END
Re: Выбор полей null в Oracle
А вот это в корне неверное утверждение, особенно для SQL профи.Andrew™ писал(а):MAVGET работает по полям первичного ключа, а это означает NOT NULL
В составном первичном ключе отдельные поля могут быть NULL, а все вместе, верно, not null.
Так, что это все же недостаток библиотеки.
Делать через MavSelect не хочу, это переписывание вручную формы, из-за одной небольшой плюхи. Сделал это средствами Oracle,
хоть и через одно место. Благо приложение мое, повезло.
Любознательный
Re: Выбор полей null в Oracle
я сказал как работает MAVGET - библа считает, что Primary key field NOT NULL, всё, правило такое, а написать свой myGET с произвольным KEY из DCT на базе MAVSelect - всего несколько строк
Re: Выбор полей null в Oracle
Да, возможно, но для хорошо знающих, как это сделать. Мне на Oracle проще, я его лучше знаю.
Но нужно будет попробовать, для тренировки.
Но нужно будет попробовать, для тренировки.
Любознательный