Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

непонятки с Null в хранимых процедурах FireBird [D7, FireBird 2.0]


MZ ©   (2007-05-29 10:51:00) 

Столкнулся с такой проблемой...

for select A,B
   from table
   into TMP1, TMP2
do
if (tmp1 is null) then....


так вот если в первой записи A или B  у меня не равны null, a в следующей равны null, в TMP1 и TMP2 остаются значения первой записи, т.е. null не присваевается этим переменным. Хотя
TMP1=null;
TMP2=null
работает..., Читал Доки по FB но ничего про это не нашел


MZ   (2007-05-29 13:06:00) [1]


> Неверно понимаешь.
>
> Если нет записи, то в INTO-переменные ничего не записывается,
>  т.е. их состояние сохраняется.
>

Век живи, век учись...... Спасибо


ANB   (2007-05-29 12:49:00) [2]


> MZ   (29.05.07 12:30) [13]

Варианты :
1. Нулли тмп3 и 4 и анализь после селекта, что получилось
2. Присобачь в запрос Count и анализь 0 или нет. Так по логике поймешь, есть записи в БД или нету.
3. Использовать вложенный курсор.
ЗЫ. Оракл при такой конструкции сгенерил бы исключение No_Data_Found.
Однако, если даже субд исключения не генерит, при использовании select into нужно всегда думать над вопросом - чего делать, если записей в базе :
а) нету
б) больше одной.
Проще всего все ситуации обрабатывать курсором.


Сергей М.   (2007-05-29 12:46:00) [3]


> в table2 нет записи удовлетворяющей условию B=:TMP1. Я так
> понимаю что этот select В, С... должен вернуть null и записать
> его в TMP3, TMP4, а этого не происходит


Неверно понимаешь.

Если нет записи, то в INTO-переменные ничего не записывается, т.е. их состояние сохраняется.


turbouser   (2007-05-29 12:45:00) [4]


> MZ   (29.05.07 12:30) [13]

нельзя делать select... from ... where b=null- неизвестно, что
сервер должен вернуть в этом случае.
Для проверки на null используется is null
В данном конкретном случае будет
for select A,B
from table1
into :TMP1, :TMP2
do
begin
if (tmp1 is null) then
begin
 TMP3=null;
 TMP4=null;
end else
begin
select B, С
from table2
where B=:TMP1
Into :TMP3, :TMP4
end


MZ   (2007-05-29 12:30:00) [5]


> Это означает, что SELECT с WHERE-условием вернул только
> одну (первую) запись.
> Думай внимательно над where B=:TMP1, где TMP1 = Null
>

TMP1 может быть и не null, просто в table2 нет записи удовлетворяющей условию B=:TMP1. Я так понимаю что этот select В, С... должен вернуть null и записать его в TMP3, TMP4, а этого не происходит
for select A,B
 from table1
 into :TMP1, :TMP2
do
begin
select B, С
from table2
where B=:TMP1
Into :TMP3, :TMP4
if (TMP3 is null) then...
end


Сергей М.   (2007-05-29 12:23:00) [6]


> MZ   (29.05.07 12:18) [10]


> я привел немного не такой код.


Так это же в корне меняет дело !


> null не присваевается в TMP3, TMP4


Это означает, что SELECT с WHERE-условием вернул только одну (первую) запись.
Думай внимательно над where B=:TMP1, где TMP1 = Null


Сергей М.   (2007-05-29 12:19:00) [7]

Если узложенные тобой условия тестирования ХП соответствуют действительности, то не верь глазам своим.

У IBExpert'а всегда существовали проблемы с трассировкой.


MZ   (2007-05-29 12:18:00) [8]

Прошу прощения, я привел немного не такой код...
for select A,B
  from table1
  into :TMP1, :TMP2
do
begin
select B, С
from table2
where B=:TMP1
Into :TMP3, :TMP4
end

так вот null не присваевается в TMP3, TMP4


MZ   (2007-05-29 12:13:00) [9]


> Каким образом тебе стал известен этот "факт" ?

выполнял пошагово средствами IBExpert


Сергей М.   (2007-05-29 12:09:00) [10]


> на основании того что в переменных остаются значения предидущих
> строк


Каким образом тебе стал известен этот "факт" ?

Ты трассировал код ХП пошагово средствами IBExpert или пользовал иные методы отладки ? Какие и как ? Рассказывай подробно ...


MZ   (2007-05-29 12:06:00) [11]


>
> > null не присваевается этим переменным
>
>

на основании того что в переменных остаются значения предидущих строк


Сергей М.   (2007-05-29 11:49:00) [12]


> MZ   (29.05.07 11:46) [5]


Тогда на основании чего ты утверждаешь, что


> null не присваевается этим переменным


?


MZ   (2007-05-29 11:46:00) [13]


> /* имена лок.переменных должны предваряться двоеточием !
> */

Двоеточия конечно же есть, это я в примере не поставил


Сергей М.   (2007-05-29 11:41:00) [14]

Либо IBExpert "глюкавит", если двоеточия в оригинале таки присутствуют.


Сергей М.   (2007-05-29 11:39:00) [15]


> ЮЮ ©   (29.05.07 11:36) [2]


> где они, эти двоеточия?


В Караганде)

Речь идет о FOR-предложении)


ЮЮ   (2007-05-29 11:36:00) [16]

> /* имена лок.переменных должны предваряться  двоеточием !*/
> if ( tmp1is null) then...

и где они, эти двоеточия? :)


Сергей М.   (2007-05-29 11:22:00) [17]


> MZ   (29.05.07 10:51)


Быть того не может ..

Сравни свой код с

for select A,B
  from table
  into :TMP1, :TMP2  /* имена лок.переменных должны предваряться двоеточием !*/
do
if (tmp1 is null) then...


Наверх

Титульная страница Поиск, карта сайта Написать письмо