2014-11-24 1 views
3

Я видел много программ pro * C, используя цикл for для выполнения набора инструкций «только один раз». Например,для циклов, содержащих блоки PL/SQL в pro * C

for(i = 0; i < 1; i++) 
{ 
    EXEC SQL EXECUTE 
    DECLARE 

     /* some declarations here */ 

    BEGIN 

     /* some PL/SQL code here */ 

    END-EXEC; 
} 

Почему это цикл необходимо?

+1

Возможно грузопассажирский культ программирования. –

+0

Обычно 'do {/ * something * /} while (0)' используется, в основном в макросах, чтобы заставить пользователя добавить ';' после вызова макроса. – Coconop

+1

@Coconop На самом деле это не значит, что нужно добавить ';'. Это должно гарантировать, что макросы с несколькими заявками ведут себя так, как ожидалось, когда они используются внутри тела структуры управления. В качестве примера: 'if thisOrThat doSomething();'. Если 'soSomething' является макросом с несколькими утверждениями, чтобы вести себя так, как ожидалось, он должен быть обернут внутри блока' do {...} while (0) '. _Maybe_ фрагмент кода, предложенный OP, служит аналогичной цели (с дополнительным недостатком требуемой локальной переменной). Без какого-то контекста трудно сказать. –

ответ

1

Просто дикая догадка: с помощью такой цикл может каким-то образом упростить обработку ошибок при использовании 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; 
Смежные вопросы