Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

непонятки с 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;
TMP2=null
работает..., Читал Доки по FB но ничего про это не нашел


 
Сергей М. ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
3-1179990389
олег_л
2007-05-24 11:06
2007.09.30
Quick Report


8-1167149205
S1lent
2006-12-26 19:06
2007.09.30
Карта высот


15-1188873231
Slider007
2007-09-04 06:33
2007.09.30
С днем рождения ! 4 сентября 2007 вторник


3-1179992276
bss
2007-05-24 11:37
2007.09.30
При сохранении изменений Post переходит на 1-ую запись


8-1166796860
nuflin
2006-12-22 17:14
2007.09.30
вопрос по openlG