powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
25 сообщений из 86, страница 1 из 4
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593638
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ожидаемый результат
Код: sql
1.
2.
3.
4.
5.
create or alter procedure "_TEST_PROC" returns ( RESULT integer ) as
begin
  --RESULT = 0;
  select NULL from RDB$DATABASE where FALSE into :RESULT;
end


RESULT =

2. Неожиданный результат
Код: sql
1.
2.
3.
4.
5.
create or alter procedure "_TEST_PROC" returns ( RESULT integer ) as
begin
  RESULT = 0;
  select NULL from RDB$DATABASE where FALSE into :RESULT;
end


RESULT = 0

3. Проверка - ожидаемый результат
Код: sql
1.
2.
3.
4.
5.
create or alter procedure "_TEST_PROC" returns ( RESULT integer ) as
begin
  RESULT = 0;
  select NULL from RDB$DATABASE where TRUE into :RESULT;
end


RESULT =

Непонятна ситуация 2: если select into вернул пустой набор данных, переменная, указанная в into , вообще "не трогается", в ней остается прежнее значение. Определенную логику в таком поведении увидеть можно, однако интуитивно по синтаксису ожидается, что после выполнения оператора значение переменной обновится. Как в операторе присваивания: странно было бы написать RESULT=xxx() и остаться при старом значении, потому что xxx ничего не вернул. Как тогда узнать, вернул или не вернул? Не вернул, и мы видим старое значение, или вернул, и мы имеем новое значение, случайно совпадающее со старым?

Так вот вопрос: такое поведение - это стандарт SQL, особенность Firebird или ошибка?

Firebird 3.0
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593648
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

Если запрос не вернул данных, то соответственно и в переменную ничего не записалось. Ошибки нет.
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593655
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyКак тогда узнать, вернул или не вернул? Не вернул, и мы видим старое значение, или вернул, и мы имеем новое значение, случайно совпадающее со старым?Узнать можно с помощью конструкции
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
  ...
into
  :RESULT;

if (row_count = 0) then
  -- данных нет
else
  -- данные есть
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593714
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky, где SUSPEND потерял?
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593749
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky 2. Неожиданный результат
create or alter procedure "_TEST_PROC" returns ( RESULT integer ) as
begin
RESULT = 0;
select NULL from RDB$DATABASE where FALSE into :RESULT;
end

Ничего неожиданного. Селект не выполняется, а значит и переменная не перезаписывается.
Так понятнее?
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593752
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devshalamyansky, где SUSPEND потерял?он и не планировался
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593954
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я кстати согласен, что момент не очевидный. И желательно его явно в документации прописать.

Одно дело "for select" - цикл он и есть цикл, внутри себя на каждый из 0,1,2,3,.... шагов ставит свои значения переменных. Нет лданных - цикл просто не выполнится.

А когда без цикла, то это интуитивно очень похоже на "VarName = (select .....)"

Получаются два возможных поведения, и они ОБА по своему логичны. Можно только зазубрить какая из логик выполняется. Но если "в первый раз" - то твердойпочвы нет, чтобы сказать "так и только так может быть".

PS. что впрочем не мешает за пару минут взять и проверить

PPS. https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-select.html#fblangref25-dml-select-into

"in PSQL if it returns at most one row, i.e., if it is a singleton select."

насколько понимаю, синглтон - это не когад "at most", а когда ровно один объект (одна строка)
IF SINGULAR( SELECT .... ) на пустом селекте будут FALSE

В любом случае, в документации не описано, как будет себя вести SELECT INTO на пустмо запросе.
Кроме того, в разделе про PSQL нет ни слова про SELECT ... INTO, хотя бы даже просто пары слов, что в PSQL режиме у операторов таких-то появляются такие-то новые возможности, о которых можно прочитать в разделе про DML. Хотя лично я бы вообще документацию про INTO-блок целиком перенес в PSQL раздел, а в DML-разделе оставил бы только упоминание о ней, чтобы было видно в каком месте этот блок вставляется. Но это уже вкусовщина
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593971
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochИ желательно его явно в документации прописать.
...
В любом случае, в документации не описано, как ...
Кто-то конкретный должен для тебя это сделать? Представь свою версию документации, мы проголосуем и может вставим в общую.
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593975
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch, по моему, поведение вполне очевидно и логично. Если, к примеру, подобный запрос внутри FOR возвращает строки, то FOR выполняет DO, если не возвращает - не выполняет. Так и здесь! Есть строка - помещаем результат в переменные, перечисленные в INTO, нет строки - не помещаем (нечего помещать).
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593982
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devArioch, по моему, поведение вполне очевидно и логично

Поведение привычно.
Иногда привычно и очевидно путают.
Для нового человека тут два варианта одинаково очевидных поведений.


rdb_devЕсли, к примеру, подобный запрос внутри FOR возвращает строки

А "если к примеру, подобный запрос внутри скобок VarName=(select...) возвращает" ноль строк, что тогда ?

Этот пример гораздо ближе к вопросу, чем цикл, которого в вопросе не было.
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593988
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

да можете вообще баг-трекер закрыть и принимать только готовые патчи с исправлениями, и ни на каплю меньше.
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39593992
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и в оракле и в мсскл всё точно так же.
обсуждать нечего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594005
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devArioch, по моему, поведение вполне очевидно и логично...

Если люди путаются, ожидая другого поведения, значит ты неправ. Не очевидно, то есть.
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594006
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийи в оракле и в мсскл всё точно так же.
обсуждать нечего.

Иногда люди в FB не с оракла или мсскл приходят, а с улицы.
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594020
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Можно форум закрыть, и в полярную экспедицию отправиться.

N.B. Кстати, в документации к Postgre, там, где into не табличный, явно написано, что into :var присваивает null, если выборка пустая.
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594024
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У кого стандарт SQL под рукой есть? Там в SELECT INTO что-то сказано по поводу пустых запросов?
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594026
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
31.01.2018 14:34, чччД пишет:
> Иногда люди в FB не с оракла или мсскл приходят, а с улицы

иногда и сантехники "работают" гинекологами
https://ria.ru/society/20180119/1512870383.html
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594030
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
31.01.2018 14:42, WildSery пишет:
> в документации к Postgre, там, где into не табличный, явно написано, что *into :var* присваивает null, если выборка пустая.

у них документация к параллельной реальности.
(не всегда соответствует реалиям)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594036
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийи в оракле и в мсскл всё точно так же.Oracle кидает исключение, насколько я помню
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594044
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
31.01.2018 14:53, hvlad пишет:
> Oracle кидает исключение, насколько я помню

NO_DATA_FOUND
но результат от этого всё одно не меняется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594072
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В документации фраза есть:

Стр. 295Простой оператор SELECT может быть использован в PSQL, только если он возвращает
единственную строку, то есть, если это запрос типа синглтон (singleton).

Может, исправить на:

Простой оператор SELECT может быть использован в PSQL, только если он возвращает не более одной строки.
В случае, когда запрос не возвращает данных (ноль строк), значение переменных <variable-list> в списке INTO <variable-list> не изменяется.

?
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594091
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий31.01.2018 14:53, hvlad пишет:
> Oracle кидает исключение, насколько я помню

NO_DATA_FOUND
но результат от этого всё одно не меняется.Есс-но. Я просто уточнил фразу про "всё точно так же" :)
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594101
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДМожет, исправить на:В русской документации ошибка перевода.
В доке ясно написано "A “plain” SELECT statement can only be used in PSQL if it returns at most one row, i.e., if it is a singleton select."
"Не более одной строки".
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594113
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryчччДМожет, исправить на:В русской документации ошибка перевода.
В доке ясно написано "A “plain” SELECT statement can only be used in PSQL if it returns at most one row, i.e., if it is a singleton select."
"Не более одной строки".

Тем более есть смысл исправить.
И по поводу случая, "когда ноль строк" - можно пару слов добавить?
...
Рейтинг: 0 / 0
Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
    #39594172
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryВ русской документации ошибка перевода.
В доке ясно написано
какого, нафиг, перевода? русский LR первичен, английский - перевод с русского.
...
Рейтинг: 0 / 0
25 сообщений из 86, страница 1 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неустановка локальной переменной при пустом наборе: стандарт, фича или баг?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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