Здесь получается такая схема работы.
1. Открыли транзакцию
2. Открыли курсор
3. Получили результат в несколько строк (fetch)
4. Закрыли транзакцию
5. Закрыли курсор
6. Открывается и закрывается транзакция несколько раз. Пока в буфере на клиенте есть записи - запросы на получение данных не идут.
7. Как только на клиенте закончились записи в буфере - переходим к пункту 2
При такой схеме легко попасть в бесконечный цикл, если нет дополнительных условий для его прерывания
Очень многое зависит от количества записей, получаемом при выборке (фетче) (при этом надо учесть, что это не константа и может отличаться для первой и последующих, а так же зависит от опций в select'е, например, firstfast).
Если количество записей в результате выборки меньше размера буфера (в данном случае, упрощая, это кол-во строк в нем помещающихся), то цикл отработает (в исходном вопросе при наложении условия в where так и происходит).
Если количество записей больше или равно размеру буфера, то попадаем в бесконечный цикл, в котором с какой-то периодичность записи будут повторяться
В общем, так делать - себе дороже.
2
PavelX
Расписали бы вы полнее задачу.
Но первое подложение сделаю

- используйте UserConnection для вашей выборки (или для операций по изменению данных)
X++:
static void Test_TTS_Continue(Args _args)
{
ProjTable projT;
int i = 0;
UserConnection conn = new UserConnection();
;
projT.setConnection(conn);
ttsbegin;
while select projT
// while select projT where projT.projId == "ИД_Проекта"
{
info(int2str(i) + ', projId = ' + projT.ProjId);
i++;
if (i>100)
return;
ttsabort;
ttsbegin;
continue;
}
ttscommit;
}