Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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;
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.042 c
3-1180375837
Zesik
2007-05-28 22:10
2007.09.30
Create table


15-1188714738
_messageboxa
2007-09-02 10:32
2007.09.30
Разбить диск


15-1188546061
Ega23
2007-08-31 11:41
2007.09.30
Неклиентская область окна


15-1189014249
Layner
2007-09-05 21:44
2007.09.30
Веб статистика от некоторых профи вебмастеров


6-1169220531
Death
2007-01-19 18:28
2007.09.30
Узнать тип сообщения, присланого TServerSocket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский