Просто дикая догадка: с помощью такой цикл может каким-то образом упростить обработку ошибок при использовании WHENEVER DO BREAK
или WHENEVER DO GOTO
:
Рассмотрим следующий фрагмент кода:
for(i = 0; i < 1; i++)
{
EXEC SQL WHENEVER SQLERROR DO BREAK;
EXEC SQL UPDATE emp SET sal = sal * 10;
}
printf("%d",i);
Если я не слишком неправильно (дон теперь у вас есть pro * C), это будет печатать 1, если SQL-запрос завершился без ошибок. Но 0 в противном случае, поскольку мы перерыв до приращения i
.
Несколько на крае, что есть общая идиома с помощью бесконечной для петли и WHENEVER DO BREAK
заявления, чтобы принести результаты:
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;)
{
EXEC SQL FETCH...
}
EXEC SQL CLOSE my_cursor;
Возможно грузопассажирский культ программирования. –
Обычно 'do {/ * something * /} while (0)' используется, в основном в макросах, чтобы заставить пользователя добавить ';' после вызова макроса. – Coconop
@Coconop На самом деле это не значит, что нужно добавить ';'. Это должно гарантировать, что макросы с несколькими заявками ведут себя так, как ожидалось, когда они используются внутри тела структуры управления. В качестве примера: 'if thisOrThat doSomething();'. Если 'soSomething' является макросом с несколькими утверждениями, чтобы вести себя так, как ожидалось, он должен быть обернут внутри блока' do {...} while (0) '. _Maybe_ фрагмент кода, предложенный OP, служит аналогичной цели (с дополнительным недостатком требуемой локальной переменной). Без какого-то контекста трудно сказать. –