Форум: "Базы";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Внизнепонятки с Null в хранимых процедурах FireBird Найти похожие ветки
← →
MZ (2007-05-29 10:51) [0]Столкнулся с такой проблемой...
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
← →
Сергей М. © (2007-05-29 11:22) [1]
> MZ (29.05.07 10:51)
Быть того не может ..
Сравни свой код сfor select A,B
from table
into :TMP1, :TMP2 /* имена лок.переменных должны предваряться двоеточием !*/
do
if (tmp1 is null) then...
← →
ЮЮ © (2007-05-29 11:36) [2]> /* имена лок.переменных должны предваряться двоеточием !*/
> if (tmp1 is null) then...
и где они, эти двоеточия? :)
← →
Сергей М. © (2007-05-29 11:39) [3]
> ЮЮ © (29.05.07 11:36) [2]
> где они, эти двоеточия?
В Караганде)
Речь идет о FOR-предложении)
← →
Сергей М. © (2007-05-29 11:41) [4]Либо IBExpert "глюкавит", если двоеточия в оригинале таки присутствуют.
← →
MZ (2007-05-29 11:46) [5]
> /* имена лок.переменных должны предваряться двоеточием !
> */
Двоеточия конечно же есть, это я в примере не поставил
← →
Сергей М. © (2007-05-29 11:49) [6]
> MZ (29.05.07 11:46) [5]
Тогда на основании чего ты утверждаешь, что
> null не присваевается этим переменным
?
← →
MZ (2007-05-29 12:06) [7]
>
> > null не присваевается этим переменным
>
>
на основании того что в переменных остаются значения предидущих строк
← →
Сергей М. © (2007-05-29 12:09) [8]
> на основании того что в переменных остаются значения предидущих
> строк
Каким образом тебе стал известен этот "факт" ?
Ты трассировал код ХП пошагово средствами IBExpert или пользовал иные методы отладки ? Какие и как ? Рассказывай подробно ...
← →
MZ (2007-05-29 12:13) [9]
> Каким образом тебе стал известен этот "факт" ?
выполнял пошагово средствами IBExpert
← →
MZ (2007-05-29 12:18) [10]Прошу прощения, я привел немного не такой код...
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
← →
Сергей М. © (2007-05-29 12:19) [11]Если узложенные тобой условия тестирования ХП соответствуют действительности, то не верь глазам своим.
У IBExpert"а всегда существовали проблемы с трассировкой.
← →
Сергей М. © (2007-05-29 12:23) [12]
> MZ (29.05.07 12:18) [10]
> я привел немного не такой код.
Так это же в корне меняет дело !
> null не присваевается в TMP3, TMP4
Это означает, что SELECT с WHERE-условием вернул только одну (первую) запись.
Думай внимательно надwhere B=:TMP1
, где TMP1 = Null
← →
MZ (2007-05-29 12:30) [13]
> Это означает, что 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
← →
turbouser © (2007-05-29 12:45) [14]
> 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
← →
Сергей М. © (2007-05-29 12:46) [15]
> в table2 нет записи удовлетворяющей условию B=:TMP1. Я так
> понимаю что этот select В, С... должен вернуть null и записать
> его в TMP3, TMP4, а этого не происходит
Неверно понимаешь.
Если нет записи, то в INTO-переменные ничего не записывается, т.е. их состояние сохраняется.
← →
ANB © (2007-05-29 12:49) [16]
> MZ (29.05.07 12:30) [13]
Варианты :
1. Нулли тмп3 и 4 и анализь после селекта, что получилось
2. Присобачь в запрос Count и анализь 0 или нет. Так по логике поймешь, есть записи в БД или нету.
3. Использовать вложенный курсор.
ЗЫ. Оракл при такой конструкции сгенерил бы исключение No_Data_Found.
Однако, если даже субд исключения не генерит, при использовании select into нужно всегда думать над вопросом - чего делать, если записей в базе :
а) нету
б) больше одной.
Проще всего все ситуации обрабатывать курсором.
← →
MZ (2007-05-29 13:06) [17]
> Неверно понимаешь.
>
> Если нет записи, то в INTO-переменные ничего не записывается,
> т.е. их состояние сохраняется.
>
Век живи, век учись...... Спасибо
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c