Страница 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.Where(sql.Field(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.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 проще, я его лучше знаю.
Но нужно будет попробовать, для тренировки.