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

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 24 Февраль 2013, 12:44

В 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 года.
Любознательный

AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 25 Февраль 2013, 5:34

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

kreator
✯ Ветеран ✯
Сообщения: 3402
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator » 25 Февраль 2013, 8:56

А разве есть SQL сервера, где проходит конструкция "where schema=null"? Сколько их поюзал, такого не встречал.
We are hard at work… for you. :)

AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 25 Февраль 2013, 9:05

Каждый сервер БД NULL интерпретирует по разному. Так что вполне возможно.
Любознательный

Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 15:32
Откуда: Москва, Зеленоград

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

Сообщение Andrew™ » 26 Февраль 2013, 8:15

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')

AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 26 Февраль 2013, 11:23

Еще бы знать, куда это сунуть, как ни делаю, ничого не выходит,

Андрей, не подскажешь, пожалуйста ?
Любознательный

Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 15:32
Откуда: Москва, Зеленоград

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

Сообщение Andrew™ » 27 Февраль 2013, 11:56

AVDU писал(а):Еще бы знать, куда это сунуть, как ни делаю, ничого не выходит,

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

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

AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 27 Февраль 2013, 14:49

Вот кусок сурса формы:

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

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.
Вопрос КАК ?
Любознательный

AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 12 Март 2013, 7:28

Похоже, спасение утопающих их собственных рук дело. Мда.
Любознательный

Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 15:32
Откуда: Москва, Зеленоград

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

Сообщение Andrew™ » 15 Март 2013, 12:03

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

AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 18 Март 2013, 9:27

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

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

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

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

Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 15:32
Откуда: Москва, Зеленоград

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

Сообщение Andrew™ » 18 Март 2013, 9:46

я сказал как работает MAVGET - библа считает, что Primary key field NOT NULL, всё, правило такое, а написать свой myGET с произвольным KEY из DCT на базе MAVSelect - всего несколько строк

AVDU
Новичок
Сообщения: 24
Зарегистрирован: 14 Декабрь 2005, 15:39
Откуда: Россия, Кемерово

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

Сообщение AVDU » 18 Март 2013, 10:35

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

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

Ответить