powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / for select и coalesce
22 сообщений из 47, страница 2 из 2
for select и coalesce
    #35484859
Dimano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvicДа хоть и курсор. Почему переменные должны зависеть от курсора?
Код: plaintext
FOR SELECT A.QQQ FROM A WHERE A.WWW < :TTT INTO :TTT
Тоже должно менятся на каждую итерацию?
...
Рейтинг: 0 / 0
for select и coalesce
    #35484877
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не путать мухи и котлеты
...
Рейтинг: 0 / 0
for select и coalesce
    #35484912
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimanoТоже должно менятся на каждую итерацию?

Да. Точно так же как и
Код: plaintext
1.
2.
3.
4.
5.
6.
i :=  0 ;
j :=  10 ;
While i < j do
  begin
   Inc(i);
   Inc(j);
  end;

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
for select и coalesce
    #35484932
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimano stelvicДа хоть и курсор. Почему переменные должны зависеть от курсора?
Код: plaintext
FOR SELECT A.QQQ FROM A WHERE A.WWW < :TTT INTO :TTT
Тоже должно менятся на каждую итерацию?Да. TTT - переменная, которая никоим образом не зависит от от конструкции в которой она участвует. Т.е., конечно, зависит - что ей присвоили в ней, то она и содержит.
...
Рейтинг: 0 / 0
for select и coalesce
    #35485096
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
DimanoТоже должно менятся на каждую итерацию?

Да. Точно так же как и
Код: plaintext
1.
2.
3.
4.
5.
6.
i :=  0 ;
j :=  10 ;
While i < j do
  begin
   Inc(i);
   Inc(j);
  end;

на самом деле, не должно. Но ты прав в том, что хрен это исправишь малой кровью.
...
Рейтинг: 0 / 0
for select и coalesce
    #35485208
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторна самом деле, не должно.
Странно, почему?
а в этой конструкции тоже не должно?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare variable i integer;
begin
  i =  0 ;
  for select ... do
  begin
    i = i + 1 ;
  end
end
или в этой?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare variable i integer;
begin
  i =  0 ;
  for select XXX from ... into :i do
  begin
    i = i + 1 ;
  end
end
...
Рейтинг: 0 / 0
for select и coalesce
    #35485232
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уточню свои слова выше. Переменная меняться должна, т.е. INTO ей будет присваивать каждый раз новое значение. Но влиять на результат селекта переменная не должна. Т.е. селект должен работать с ее копией на момент начала выполнения запроса.
...
Рейтинг: 0 / 0
for select и coalesce
    #35485244
Glok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
Вот они золотые слова...
...
Рейтинг: 0 / 0
for select и coalesce
    #35485281
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну насколько я понимаю в конструкции
Код: plaintext
FOR SELECT A.QQQ FROM A WHERE A.WWW < :TTT INTO :TTT
так и есть. Т.е. сначала по селекту отбирается промежуточный набор данных с условием A.WWW < значения, кот было на тот момент, а потом этот набор перебирается. Или я неправильно понимаю?
...
Рейтинг: 0 / 0
for select и coalesce
    #35485316
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
щас проверил, похоже, неправильно я понимал. Таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ID           NAIM
 1             jkl
 2             <null>
 3             <null>
 4              123 
 5             <null>
 6             <null>
 7             <null>
 8             <null>
процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE NEW_PROCEDURE 
returns (ttt varchar( 20 ))
as
begin
  ttt = '2';
  for select coalesce(TEST.NAIM, :ttt) as TTT from TEST where TEST.NAIM<:ttt into :ttt do
  begin
    suspend;
  end
end
результат:
Код: plaintext
1.
2.
TTT
 111 
...
Рейтинг: 0 / 0
for select и coalesce
    #35485322
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибочка в предыдущем посте.
таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ID           NAIM
 1              111 
 2             <null>
 3             <null>
 4              123 
 5             <null>
 6             <null>
 7             <null>
 8             <null>
...
Рейтинг: 0 / 0
for select и coalesce
    #35485329
chAlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, с функцией между select и into изменения на лету происходят, а с нормальными проверками нет, так что ли? А с какими функциями -- любыми, или только с сабжевой новомодной заменой case?
...
Рейтинг: 0 / 0
for select и coalesce
    #35485358
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chAlxКороче, с функцией между select и into изменения на лету происходят, а с нормальными проверками нет, так что ли? А с какими функциями -- любыми, или только с сабжевой новомодной заменой case?Что-то не понял я вопроса. В примерах автора изменения с переменной происходят в начале каждой итерации. Конструкция into присваивает ей новое значение, зависящее от того, что лежит в поле таблицы и от предыдущего значения переменной.
...
Рейтинг: 0 / 0
for select и coalesce
    #35485436
Dimano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэкспереминтировал поразному, выдаёт также как и в первом случае.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or alter procedure new_procedure
returns (
    ttt varchar( 20 ))
as
  declare c cursor for (select coalesce(test.naim, :ttt) as ttt from test);
begin
  open c;
  while ( 1  =  1 ) do
  begin
    fetch c into :ttt;
    if (row_count =  0 ) then
      leave;
    suspend;
  end
  close c;
end
Код: plaintext
1.
2.
3.
4.
  for select ttt from (select coalesce(test.naim, :ttt) as ttt from test) into :ttt do
  begin
    suspend;
  end
...
Рейтинг: 0 / 0
for select и coalesce
    #35485489
chAlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic chAlxКороче, с функцией между select и into изменения на лету происходят, а с нормальными проверками нет, так что ли? А с какими функциями -- любыми, или только с сабжевой новомодной заменой case?Что-то не понял я вопроса. В примерах автора изменения с переменной происходят в начале каждой итерации. Конструкция into присваивает ей новое значение, зависящее от того, что лежит в поле таблицы и от предыдущего значения переменной.

Примеры с функцией coalesce() показывают, что в ней переменная [ошибочно] пересчитывается. Примеры без функции (select id where id > :idmax into :idmax) покажут, что она [традиционно] не пересчитывается. Вопрос в том, где граница у этого поведения: любая ли функция приводит к такому эффекту, или только сабжевая, или вообще не в ней дело..
...
Рейтинг: 0 / 0
for select и coalesce
    #35485509
Dimano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimano
Код: plaintext
FOR SELECT A.QQQ FROM A WHERE A.WWW < :TTT INTO :TTT
Тоже должно менятся на каждую итерацию?
Вот ведь, а я думал съязвил...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
TID
 1 
 2 
 3 
 4 
 5 
 6 
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or alter procedure new_procedure
returns (
    ttt integer)
as
begin
 ttt =  1 ;
 for select test.aid +  1  as ttt from test where test.aid <= :ttt into :ttt do
 begin
   suspend;
 end
end
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
TTT
 2 
 3 
 4 
 5 
 6 
 7 
Пойдука тоже посмотрю свои процедурки на всякий...
...
Рейтинг: 0 / 0
for select и coalesce
    #35485572
Dimano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игры с сортировкой помогают.
Код: plaintext
1.
2.
3.
4.
5.
  ttt = 'qqq';
  for select coalesce(test.naim, :ttt) as ttt from test order by test.naim nulls first into :ttt do
  begin
    suspend;
  end
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
TTT
qqq
qqq
qqq
qqq
 111 
 222 
Код: plaintext
1.
2.
3.
4.
5.
 ttt =  1 ;
 for select test.aid +  1  as ttt from test where test.aid <= :ttt order by  1  into :ttt do
 begin
   suspend;
 end
Код: plaintext
1.
2.
TTT
 2 
Хотя в первом случае не по тойже причине что во втором.
...
Рейтинг: 0 / 0
for select и coalesce
    #35485638
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chAlx

Примеры с функцией coalesce() показывают, что в ней переменная [ошибочно] пересчитывается. Примеры без функции (select id where id > :idmax into :idmax) покажут, что она [традиционно] не пересчитывается. Вопрос в том, где граница у этого поведения: любая ли функция приводит к такому эффекту, или только сабжевая, или вообще не в ней дело..

я бы поспорил с ошибочностью этого поведения, думаю кто использует таким образом переменную (первый вариант) прекрасно понимает к чему это может привести, в противном случае использовал бы либо константу либо завел копию. Это чтоб не писать лишнего кода между BEGIN--END, я так понимаю:

Код: plaintext
1.
FOR SELECT a,COALESCE(b,:b) FROM T INTO :a,:b DO
  SUSPEND;
эквивалентно

Код: plaintext
1.
2.
3.
4.
FOR SELECT a,b FROM T INTO :a,:b DO
BEGIN
  IF (b IS NULL) THEN b = old_b ELSE old_b = b;
  SUSPEND;
END

хотя зачем такое может понадобиться я хз
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
for select и coalesce
    #38826818
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrуточню свои слова выше. Переменная меняться должна, т.е. INTO ей будет присваивать каждый раз новое значение. Но влиять на результат селекта переменная не должна. Т.е. селект должен работать с ее копией на момент начала выполнения запроса.

В тройке теперь именно так?
...
Рейтинг: 0 / 0
for select и coalesce
    #38826885
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__В тройке теперь именно так?
проверь
...
Рейтинг: 0 / 0
for select и coalesce
    #38827191
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov Glokмогут и исправить.

Не могут. Слишком многие приложения тогда рассыплются. Представь, что
перестанет работать такое:
Код: sql
1.
for select get_id(gen, 1) from table...


Точнее не перестанет, а начнёт выдавать константу. А ведь это широко
разрекламированный способ прерывания длинных выборок.


В оракле так ( и не только для генераторов, но и для функций (выборки из коллекции) при использовании connect by и level в качестве параметра ), а вообще на мой взгляд FB ведёт себя правильно, разве стабильность курсора имеет отношение к переменным?
...
Рейтинг: 0 / 0
for select и coalesce
    #38827194
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раскопал артефакт...
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / for select и coalesce
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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