Страница 1 из 1

Выбор полей null в Oracle

Добавлено: 24 Февраль 2013, 13:44
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 года.

Re: Выбор полей null в Oracle

Добавлено: 25 Февраль 2013, 6:34
AVDU
Уточняю. Версия MAV - mav_c63_20100227.
При открытии формы появляется ошибка record not found, поскольку Oracle не может найти
запись по условию = NULL. Ему нужно указывать IS NULL.
В Oracle нельзя сравнивать NULL с чем либо, поскольку его значения неопределено.
По русски это будет пойди не знаю куда, найди не знаю что.
К сожалению, мой первичный ключ содержит набор полей, два из которых могут быть NULL. Первый раз такая ситуация.

Re: Выбор полей null в Oracle

Добавлено: 25 Февраль 2013, 9:56
kreator
А разве есть SQL сервера, где проходит конструкция "where schema=null"? Сколько их поюзал, такого не встречал.

Re: Выбор полей null в Oracle

Добавлено: 25 Февраль 2013, 10:05
AVDU
Каждый сервер БД NULL интерпретирует по разному. Так что вполне возможно.

Re: Выбор полей null в Oracle

Добавлено: 26 Февраль 2013, 9:15
Andrew™
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

Добавлено: 26 Февраль 2013, 12:23
AVDU
Еще бы знать, куда это сунуть, как ни делаю, ничого не выходит,

Андрей, не подскажешь, пожалуйста ?

Re: Выбор полей null в Oracle

Добавлено: 27 Февраль 2013, 12:56
Andrew™
AVDU писал(а):Еще бы знать, куда это сунуть, как ни делаю, ничого не выходит,

Андрей, не подскажешь, пожалуйста ?

мне от сюда тоже не видно где и кто генерит данный код - дай хотя бы процедуру .CLW где это происходит

Re: Выбор полей null в Oracle

Добавлено: 27 Февраль 2013, 15:49
AVDU
Вот кусок сурса формы:

Код: Выделить всё

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 я попытался вставить SELF.Select.Where(SELF.Select.Field(vprotect_list.schema) & ' is null').
Как я понимаю MAVGET дает запрос по полям первичного ключа, и ему нужно сказать, что бы он генерил не = NULL,
а IS NULL.
Затем то же самое нужно сказать MAVUpdate. И MavDelete.
Вопрос КАК ?

Re: Выбор полей null в Oracle

Добавлено: 12 Март 2013, 8:28
AVDU
Похоже, спасение утопающих их собственных рук дело. Мда.

Re: Выбор полей null в Oracle

Добавлено: 15 Март 2013, 13:03
Andrew™
AVDU писал(а):Похоже, спасение утопающих их собственных рук дело. Мда.
MAVGET работает по полям первичного ключа, а это означает NOT NULL

нужно гибкое решение - используй 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

Добавлено: 18 Март 2013, 10:27
AVDU
Andrew™ писал(а):MAVGET работает по полям первичного ключа, а это означает NOT NULL
А вот это в корне неверное утверждение, особенно для SQL профи.

В составном первичном ключе отдельные поля могут быть NULL, а все вместе, верно, not null.

Так, что это все же недостаток библиотеки.

Делать через MavSelect не хочу, это переписывание вручную формы, из-за одной небольшой плюхи. Сделал это средствами Oracle,
хоть и через одно место. Благо приложение мое, повезло.

Re: Выбор полей null в Oracle

Добавлено: 18 Март 2013, 10:46
Andrew™
я сказал как работает MAVGET - библа считает, что Primary key field NOT NULL, всё, правило такое, а написать свой myGET с произвольным KEY из DCT на базе MAVSelect - всего несколько строк

Re: Выбор полей null в Oracle

Добавлено: 18 Март 2013, 11:35
AVDU
Да, возможно, но для хорошо знающих, как это сделать. Мне на Oracle проще, я его лучше знаю.

Но нужно будет попробовать, для тренировки.