|
|
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Пользую FB уже пару лет, но только сейчас обнаружил такую вещь: если в результате выполнения select ... into ... под условие не попадает ни одной строки, в переменных из предложения into остаются те же значения, что были и до выполнения этого оператора, а не заносятся null-ы. (Из-за моего этого заблуждения одна сложная ХП работала неверно, только когда стал разбираться, понял в чем дело.) Поискал в доках, где описана эта особенность, но не нашел. Если не трудно, ткните в то место, где про это сказано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 15:59:46 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Да, забыл сказать: сервер FB 1.5.3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 16:14:58 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Вообще-то поведение очевидное и предсказуемое. В BOL для M$ SQL это точно описано, а вот искать и распаковывать доку для Interbase мне лениво, ищи сам, думаю что это либо в синтаксисе SELECT'а описано, либо в разделе по ХП. В общем, пилите, Шура... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 17:14:46 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
_avzПользую FB уже пару лет, но только сейчас обнаружил такую вещь: если в результате выполнения select ... into ... под условие не попадает ни одной строки, в переменных из предложения into остаются те же значения, что были и до выполнения этого оператора, а не заносятся null-ы.Так и должно быть и много раз говорилось: инициализируйте переменные перед циклом. _avzПоискал в доках, где описана эта особенность, но не нашел. Если не трудно, ткните в то место, где про это сказано.В доках это явно может и не описано, но for select - это цикл. Соответственно если у тебя цикл (while к примеру) не срабатывает, то выполнение просто передается дальше - что ты и наблюдаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 17:35:10 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
пример примитивный: if условие then a:=5; если условие = false, чему будет равно a? Правильно. Тому значению, которое до этого было в a. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 17:38:21 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Да уж... Совсем проще некуда объяснил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 17:49:52 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Можно ли гарантировать, что при входе в триггер/процедуру переменные инициализируются в NULL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 19:56:09 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
В моем случае (очень упрощенно) было так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Просто мне казалось очевидным, что если записи не найдется xxx_id будет null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 20:09:42 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
"Гаджимурадов Рустам" <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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 20:44:48 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
SextonМожно ли гарантировать, что при входе в триггер/процедуру переменные инициализируются в NULL? В FB сервер это гарантирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 21:50:39 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
mvНе о "for select..." шла речь, а о простом "select into param_list ". Если record_count = 0, то param_list не меняется. Я думал, что люди это выучивают на первом месяце работы с сервером :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 21:51:35 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
dimitr mvНе о "for select..." шла речь, а о простом "select into param_list ". Если record_count = 0, то param_list не меняется. Я думал, что люди это выучивают на первом месяце работы с сервером :-)Надо бы прописать это в доку... Во избежание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 00:32:35 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
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" только выполняющийся один раз, хотя как это реализовано в коде не знаю - пока ДЕ здесь пусть как раз и просветит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 00:34:33 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
именно так и реализовано. Цикл с ограничением сингулярности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 07:29:26 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
dimitrЯ думал, что люди это выучивают на первом месяце работы с сервером :-) Да, знаю, двойка мне за незнание очевидных (как оказалось) вещей. Кстати, задумавшись, как же я раньше на это не наступил, стал смотреть код хранимок во всех своих разработанных базах. Самое смешное, что я везде в таких циклах инициализировал такие переменные null-ами, особо не задумываясь. А в последнем проекте, видать после полугодового перерыва, потерял эту привычку... Ладно, прощу прощения за идиотский вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 08:12:13 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
_avzя везде в таких циклах инициализировал такие переменные null-ами при возврате запросом NULLа это бы тебя не спасло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 08:27:49 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
dimitr при возврате запросом NULLа это бы тебя не спасло. В основном речь идет о выборке вместе с ПК, а потом делается проверка переменной именно для ПК на is null. ПК null-ом быть не может, поэтому все нормально :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 08:47:41 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
dimitr SextonМожно ли гарантировать, что при входе в триггер/процедуру переменные инициализируются в NULL? В FB сервер это гарантирует. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 08:52:07 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
_avz dimitr при возврате запросом NULLа это бы тебя не спасло. В основном речь идет о выборке вместе с ПК, а потом делается проверка переменной именно для ПК на is null. ПК null-ом быть не может, поэтому все нормально :-) Более корректное решение это проверять row_count на 0, правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 09:04:24 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
_avzПользую FB уже пару лет, но только сейчас обнаружил такую вещь: Мне повезло: я столкнулся с этим на первом месяце работы :) Вообще-то ситуация такая же, как и в, скажем, Дельфи. Если переменной не задавать значение, оно остается прежним. И здесь: если селект не возвращает запись, в переменные никак нельзя записать нулл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 10:31:34 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
_avzБолее корректное решение это проверять row_count на 0, правильно? При селектах row_count возвращает 0 насколько я знаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 10:39:09 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
в смысле всегда 0, независимо от количества выбранных строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 10:40:12 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
to _spy_ В 2-ке ни фига ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 10:47:33 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
FreemanZAVto _spy_ В 2-ке ни фига Спасибо, буду знать, 2-ку еще не юзал. P.S. Но у автора 1.5.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 10:57:25 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
если в примерах выше переменная не обnull'яется то вот новая неожиданность: Код: plsql 1. в переменную пишется null, если записи не найдены :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 12:48:34 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Johnnyyy, и что тут неожиданного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 12:52:54 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 12:55:33 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
kdvJohnnyyy, читал бы ты http://www.ibase.ru/devinfo/sp_call.htm не нашел там присваивание в переменную без into ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 13:03:14 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Johnnyyy, понимаешь ли когда ты делаешь присваивание переменной её значение должно измениться в любом случае, поскольку записей нет логично записать null. Когда делается select ... into, то оно значение переменной измениться только если запрос вернёт данные. Всё довольно просто. И по мне так это намного лучше чем делает Оракл, генерируя исключение NO_DATA_FOUND ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 13:08:17 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисJohnnyyy, понимаешь ли когда ты делаешь присваивание переменной её значение должно измениться в любом случае, поскольку записей нет логично записать null. Когда делается select ... into, то оно значение переменной измениться только если запрос вернёт данные. Всё довольно просто. И по мне так это намного лучше чем делает Оракл, генерируя исключение NO_DATA_FOUND Так я понял это опытным путем. Ни в одном туторе просто не находил конструкции с описанием, которую привел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 13:13:33 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 13:25:14 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисJohnnyyyНи в одном туторе просто не находил конструкции с описанием, которую привел а это что? спасибо за ссылку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 13:35:06 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Симонов Денисеё значение должно измениться в любом случае... то оно значение переменной измениться только если запрос вернёт данные.Сам себе противоречишь. Был null, и стал null - где изменение? Симонов ДенисИ по мне так это намного лучше чем делает Оракл, генерируя исключение NO_DATA_FOUNDЧем оно "намного" лучше? И там и там нужно написать обертку (хоть count(*), max(value) into l_cnt, l_value или обработку исключения) если надо знать точно, выбралась ли одна или ноль записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 13:37:04 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
ГхостикСам себе противоречишь. Был null, и стал null - где изменение? а если был не null, стал null ГхостикЧем оно "намного" лучше? тем что писать меньше, если точно знаешь что выбираемый столбец not null, то достаточно сделать. Код: plsql 1. 2. 3. а чтобы определить сколько записей вернулось 1 или 0, есть такая переменная как ROW_COUNT Код: plsql 1. 2. и никаких тебе обработок исключений, MAX, COUNT. Тем более это не самые дешёвые операции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 13:55:15 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисГхостикСам себе противоречишь. Был null, и стал null - где изменение? а если был не null, стал nullВыкинул половину своего утверждения, ложную, и говоришь что оно истинное. Симонов Денисесли точно знаешь что выбираемый столбец not null, то достаточно сделать.Опасная практика. Сегодня он not null, а завтра nullable, а весь код не забыли ли просмотреть? Симонов Денисписать меньшеСравни: Код: plsql 1. 2. Код: plsql 1. 2. Разница - на одно объявление переменной. Это ты называешь "намного"? Симонов ДенисТем более это не самые дешёвые операцииО да. На нуле либо одной записи - особенно тяжелые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:12:17 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Гхостик, а теперь внимание, неожиданно запрос Код: sql 1. вернул более 1 записи и вот это Код: sql 1. спокойно проглотит эту ситуацию, где по идее должно быть исключение. Для обеспечения того же самого вам ещё потребуется добавить Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:27:21 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, тьфу не то написал Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:30:40 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Неудобные вопросы просто игнорируем? Симонов Денисспокойно проглотит эту ситуацию, где по идее должно быть исключение. Да. Но смена количества полей в PK (одну запись обычно ищут именно так) - гораздо более редкое действие, чем смена not null на null. И код при этом просматривается тщательней. А вообще, в оракле я обычно ни count, ни exception не делаю там, где предполагается одна запись. Там, где это может быть ошибкой пользовательского ввода - там обрабатываю no_data_found, и too_many_rows тоже не пропадут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:39:19 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
ГхостикОпасная практика. Сегодня он not null, а завтра nullable, а весь код не забыли ли просмотреть? это что ли неудобный вопрос? Ну так есть поля которые никогда не станут nullable и это я знаю точно. Хотя подход с проверкой количества записей универсальнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:52:24 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамПо большому счету "select into param_list" это тот же "for select" только выполняющийся один раз, dimitrименно так и реализовано. Цикл с ограничением сингулярности. ...и выкопали стюардессу. А правильно ли это "с ограничением", а не "с проверкой" ? Т.е. в 2.1 в check-триггере Код: sql 1. выдал ошибку "select is illegal in this context" Можно переписать на for с отдельным счётчиком, или с проверкой row_count, которую вроде бы поправили (но какой смысл у row_count внутри check в процессе Insert?) var = (select ... ) выдаст ошибку при 2 и более значениях. А select into без for - не выдаст. И выдаст ли он первую строку или последнюю - детали реализации (возможно уже задокументированные, но тем не менее - детали). И возникает сомнение, правильно ли идеологически, что select-into не ограничивает (не проверяет, не навязывает) сингулярность результата ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2014, 16:41:04 |
|
||
|
Неожиданности select ... into в ХП
|
|||
|---|---|---|---|
|
#18+
AriochА select into без for - не выдаст. И выдаст ли он первую строку или последнюю - детали реализации (возможно уже задокументированные, но тем не менее - детали). И возникает сомнение, правильно ли идеологически, что select-into не ограничивает (не проверяет, не навязывает) сингулярность результата ? Чего, чего? Ещё как выдаст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2014, 16:57:51 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1563888]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
172ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 431ms |

| 0 / 0 |
