powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неожиданности select ... into в ХП
41 сообщений из 41, показаны все 2 страниц
Неожиданности select ... into в ХП
    #33639702
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользую FB уже пару лет, но только сейчас обнаружил такую вещь: если в результате выполнения select ... into ... под условие не попадает ни одной строки, в переменных из предложения into остаются те же значения, что были и до выполнения этого оператора, а не заносятся null-ы. (Из-за моего этого заблуждения одна сложная ХП работала неверно, только когда стал разбираться, понял в чем дело.) Поискал в доках, где описана эта особенность, но не нашел. Если не трудно, ткните в то место, где про это сказано.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639712
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл сказать: сервер FB 1.5.3.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639752
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то поведение очевидное и предсказуемое. В BOL для M$ SQL это точно описано, а вот искать и распаковывать доку для Interbase мне лениво, ищи сам, думаю что это либо в синтаксисе SELECT'а описано, либо в разделе по ХП. В общем, пилите, Шура...
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639761
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzПользую FB уже пару лет, но только сейчас обнаружил такую вещь: если в результате выполнения select ... into ... под условие не попадает ни одной строки, в переменных из предложения into остаются те же значения, что были и до выполнения этого оператора, а не заносятся null-ы.Так и должно быть и много раз говорилось: инициализируйте переменные перед циклом.
_avzПоискал в доках, где описана эта особенность, но не нашел. Если не трудно, ткните в то место, где про это сказано.В доках это явно может и не описано, но for select - это цикл. Соответственно если у тебя цикл (while к примеру) не срабатывает, то выполнение просто передается дальше - что ты и наблюдаешь.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639766
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример примитивный:

if условие then
a:=5;

если условие = false, чему будет равно a? Правильно. Тому значению, которое до этого было в a.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639772
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж... Совсем проще некуда объяснил...
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639855
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли гарантировать, что при входе в триггер/процедуру переменные инициализируются в NULL?
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639870
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем случае (очень упрощенно) было так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
for select ...
  // ищем, была ли запись с таким id в таблице
   xxx_id = null;     --  оказывается это делать обязательно, иначе останется 
                         --  значение из предыдущего цикла
   select .... into :xxx_id;
   if (xxx_id is null) then
   begin
     ...
   end
   else begin
     ...
   end
  ...

Просто мне казалось очевидным, что если записи не найдется xxx_id будет null.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639894
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Гаджимурадов Рустам" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2515345@sql.ru...
....
> В доках это явно может и не описано, но for select - это цикл.
Соответственно если у тебя цикл (while к примеру) не срабатывает, то
выполнение просто передается дальше - что ты и наблюдаешь.

Не о "for select..." шла речь, а о простом "select into param_list ".
Если record_count = 0, то param_list не меняется.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639927
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonМожно ли гарантировать, что при входе в триггер/процедуру переменные инициализируются в NULL?
В FB сервер это гарантирует.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33639929
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mvНе о "for select..." шла речь, а о простом "select into param_list ".
Если record_count = 0, то param_list не меняется.
Я думал, что люди это выучивают на первом месяце работы с сервером :-)
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640022
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr mvНе о "for select..." шла речь, а о простом "select into param_list ".
Если record_count = 0, то param_list не меняется.
Я думал, что люди это выучивают на первом месяце работы с сервером :-)Надо бы прописать это в доку... Во избежание.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640025
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mv"Гаджимурадов Рустам" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2515345@sql.ru...
....
> В доках это явно может и не описано, но for select - это цикл.
Соответственно если у тебя цикл (while к примеру) не срабатывает, то
выполнение просто передается дальше - что ты и наблюдаешь.

Не о "for select..." шла речь, а о простом "select into param_list ".
Если record_count = 0, то param_list не меняется.По большому счету "select into param_list" это тот же "for select" только выполняющийся один раз,
хотя как это реализовано в коде не знаю - пока ДЕ здесь пусть как раз и просветит.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640105
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
именно так и реализовано. Цикл с ограничением сингулярности.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640127
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrЯ думал, что люди это выучивают на первом месяце работы с сервером :-)

Да, знаю, двойка мне за незнание очевидных (как оказалось) вещей.
Кстати, задумавшись, как же я раньше на это не наступил, стал смотреть код хранимок во всех своих разработанных базах. Самое смешное, что я везде в таких циклах инициализировал такие переменные null-ами, особо не задумываясь. А в последнем проекте, видать после полугодового перерыва, потерял эту привычку... Ладно, прощу прощения за идиотский вопрос.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640143
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzя везде в таких циклах инициализировал такие переменные null-ами

при возврате запросом NULLа это бы тебя не спасло.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640158
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
при возврате запросом NULLа это бы тебя не спасло.
В основном речь идет о выборке вместе с ПК, а потом делается проверка переменной именно для ПК на is null. ПК null-ом быть не может, поэтому все нормально :-)
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640160
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr SextonМожно ли гарантировать, что при входе в триггер/процедуру переменные инициализируются в NULL?
В FB сервер это гарантирует.
Спасибо
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640172
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avz dimitr
при возврате запросом NULLа это бы тебя не спасло.
В основном речь идет о выборке вместе с ПК, а потом делается проверка переменной именно для ПК на is null. ПК null-ом быть не может, поэтому все нормально :-)
Более корректное решение это проверять row_count на 0, правильно?
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640393
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzПользую FB уже пару лет, но только сейчас обнаружил такую вещь: Мне повезло: я столкнулся с этим на первом месяце работы :)
Вообще-то ситуация такая же, как и в, скажем, Дельфи. Если переменной не задавать значение, оно остается прежним. И здесь: если селект не возвращает запись, в переменные никак нельзя записать нулл.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640428
_spy_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzБолее корректное решение это проверять row_count на 0, правильно?
При селектах row_count возвращает 0 насколько я знаю...
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640434
_spy_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в смысле всегда 0, независимо от количества выбранных строк
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640450
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to _spy_
В 2-ке ни фига
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #33640490
_spy_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreemanZAVto _spy_
В 2-ке ни фига
Спасибо, буду знать, 2-ку еще не юзал.
P.S. Но у автора 1.5.3
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Неожиданности select ... into в ХП
    #38553157
Johnnyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если в примерах выше переменная не обnull'яется
то вот новая неожиданность:

Код: plsql
1.
<перем> = (select ... from tabl1);



в переменную пишется null, если записи не найдены :)
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553175
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnnyyy,

и что тут неожиданного?
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553181
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnnyyy,

читал бы ты
http://www.ibase.ru/devinfo/sp_call.htm
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553197
Johnnyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvJohnnyyy,

читал бы ты
http://www.ibase.ru/devinfo/sp_call.htm

не нашел там присваивание в переменную без into
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553209
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnnyyy,

понимаешь ли когда ты делаешь присваивание переменной её значение должно измениться в любом случае, поскольку записей нет логично записать null. Когда делается select ... into, то оно значение переменной измениться только если запрос вернёт данные. Всё довольно просто. И по мне так это намного лучше чем делает Оракл, генерируя исключение NO_DATA_FOUND
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553224
Johnnyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисJohnnyyy,

понимаешь ли когда ты делаешь присваивание переменной её значение должно измениться в любом случае, поскольку записей нет логично записать null. Когда делается select ... into, то оно значение переменной измениться только если запрос вернёт данные. Всё довольно просто. И по мне так это намного лучше чем делает Оракл, генерируя исключение NO_DATA_FOUND

Так я понял это опытным путем. Ни в одном туторе просто не находил конструкции с описанием, которую привел
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553255
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnnyyyНи в одном туторе просто не находил конструкции с описанием, которую привел

а это что?
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553288
Johnnyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисJohnnyyyНи в одном туторе просто не находил конструкции с описанием, которую привел

а это что?

спасибо за ссылку
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553297
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисеё значение должно измениться в любом случае...

то оно значение переменной измениться только если запрос вернёт данные.Сам себе противоречишь. Был null, и стал null - где изменение?

Симонов ДенисИ по мне так это намного лучше чем делает Оракл, генерируя исключение NO_DATA_FOUNDЧем оно "намного" лучше?

И там и там нужно написать обертку (хоть count(*), max(value) into l_cnt, l_value или обработку исключения) если надо знать точно, выбралась ли одна или ноль записей.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553347
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГхостикСам себе противоречишь. Был null, и стал null - где изменение?
а если был не null, стал null

ГхостикЧем оно "намного" лучше?
тем что писать меньше, если точно знаешь что выбираемый столбец not null, то достаточно сделать.

Код: plsql
1.
2.
3.
var = null;
select myfield from table into :var;
if (var is not null) then



а чтобы определить сколько записей вернулось 1 или 0, есть такая переменная как ROW_COUNT

Код: plsql
1.
2.
select myfield from table into :var;
if (ROW_COUNT = 1) then



и никаких тебе обработок исключений, MAX, COUNT. Тем более это не самые дешёвые операции
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553403
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисГхостикСам себе противоречишь. Был null, и стал null - где изменение?
а если был не null, стал nullВыкинул половину своего утверждения, ложную, и говоришь что оно истинное.

Симонов Денисесли точно знаешь что выбираемый столбец not null, то достаточно сделать.Опасная практика. Сегодня он not null, а завтра nullable, а весь код не забыли ли просмотреть?

Симонов Денисписать меньшеСравни:
Код: plsql
1.
2.
select myfield from table into :var;
if (ROW_COUNT = 1) then



Код: plsql
1.
2.
select count(*), max(myfield) into l_cnt, l_var from table;
if l_cnt = 1 then


Разница - на одно объявление переменной. Это ты называешь "намного"?

Симонов ДенисТем более это не самые дешёвые операцииО да. На нуле либо одной записи - особенно тяжелые.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553444
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостик,

а теперь внимание, неожиданно запрос
Код: sql
1.
select myfield from table


вернул более 1 записи и вот это
Код: sql
1.
select count(*), max(myfield) into l_cnt, l_var from table;


спокойно проглотит эту ситуацию, где по идее должно быть исключение. Для обеспечения того же самого вам ещё потребуется добавить
Код: plsql
1.
if (ROW_COUNT > 1) then exception e_myerror;
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553460
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

тьфу не то написал

Код: plsql
1.
if (l_cnt > 1) then exception e_myerror;
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553485
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неудобные вопросы просто игнорируем?

Симонов Денисспокойно проглотит эту ситуацию, где по идее должно быть исключение. Да. Но смена количества полей в PK (одну запись обычно ищут именно так) - гораздо более редкое действие, чем смена not null на null. И код при этом просматривается тщательней.

А вообще, в оракле я обычно ни count, ни exception не делаю там, где предполагается одна запись. Там, где это может быть ошибкой пользовательского ввода - там обрабатываю no_data_found, и too_many_rows тоже не пропадут.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38553518
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГхостикОпасная практика. Сегодня он not null, а завтра nullable, а весь код не забыли ли просмотреть?

это что ли неудобный вопрос? Ну так есть поля которые никогда не станут nullable и это я знаю точно. Хотя подход с проверкой количества записей универсальнее.
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38561268
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамПо большому счету "select into param_list" это тот же "for select" только выполняющийся один раз,

dimitrименно так и реализовано. Цикл с ограничением сингулярности.

...и выкопали стюардессу.

А правильно ли это "с ограничением", а не "с проверкой" ?

Т.е. в 2.1 в check-триггере
Код: sql
1.
 var1 = ( select column1 from same_table s where s.id = new.parent_id )

выдал ошибку "select is illegal in this context"

Можно переписать на for с отдельным счётчиком, или с проверкой row_count, которую вроде бы поправили (но какой смысл у row_count внутри check в процессе Insert?)

var = (select ... ) выдаст ошибку при 2 и более значениях.

А select into без for - не выдаст. И выдаст ли он первую строку или последнюю - детали реализации (возможно уже задокументированные, но тем не менее - детали).

И возникает сомнение, правильно ли идеологически, что select-into не ограничивает (не проверяет, не навязывает) сингулярность результата ?
...
Рейтинг: 0 / 0
Неожиданности select ... into в ХП
    #38561298
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochА select into без for - не выдаст. И выдаст ли он первую строку или последнюю - детали реализации (возможно уже задокументированные, но тем не менее - детали).

И возникает сомнение, правильно ли идеологически, что select-into не ограничивает (не проверяет, не навязывает) сингулярность результата ?

Чего, чего? Ещё как выдаст.
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неожиданности select ... into в ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]