![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
непонятки с 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;работает..., Читал Доки по FB но ничего про это не нашел
TMP2=null
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...