Для цикла, заключающего блоки PL/SQL в pro*C

Я видел много программ на pro*C, использующих цикл for для выполнения набора операторов "только один раз". Например,

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

        /* some declarations here */

    BEGIN

        /* some PL/SQL code here  */

    END-EXEC;
}

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

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; 

Один из распространенных сценариев использования такого цикла - это когда данные доступны в массиве, который будет использоваться где-то еще в программе, но в некоторых разделах вам нужно обработать только первую запись этого массива.

Этот цикл помогает выделить первую запись таких массивов.

Однако, когда вам нужно выделить первую запись массива, убедитесь, что вы используете "порядок по" в своем курсоре выборки, чтобы вы могли контролировать, какая будет ваша первая запись, и соответственно выполнять с ней необходимые операции.

Другие вопросы по тегам