Главная ]
3.4.4.Выполнение инструкции запроса в контексте курсора
Программирование
Базы данных



 

Чтобы возвратить элементы списка выборки строки инструкции, строка должна быть выполнена в пределах контекста курсора. Все объявления курсора в InterBase фиксированы, встроенные инструкции вставлены  в приложение прежде, чем оно будет откомпилировано. Разработчики DSQL приложений должны предусмотреть потребность в курсорах при написании приложения и объявлять их заранее.

Конструкция  цикла используется, чтобы выбрать отдельную строку сразу из курсора и обработать каждый элемент списка выбора (столбец) в той строке прежде, чем будет выбрана следующая строка. Для выполнения инструкции  в пределах контекста курсора и поиска строк списка выбора элементов, следуют этими шагами:

1. Выполните инструкцию с помощью isc_dsql_execute2():

isc_dsql_execute2(status_vector, &trans, &stmt, 1,in_xsqlda, out_xsqlda);

Примечание от автора:

     При работе с ф-ей isc_dsql_execute2 существует хитрость не указанная в справочнике и служащая иточником ошибок. Если возвращается набор строк и необходимо открытие курсора то вместо out_sqlda надо передавать NULL иначе вернется ошибка. Если заранее известно что вернется одна и только одна строка, то надо передавать out_sqlda как показано в примере, но не создавать курсор. А просто обработать после отработки функции структуру вывода. Так что в этом примере не верно произведен вызов ф-ии.

2. Объявлите и откройте курсор для инструкции строки с помощью

isc_dsql_set_cursor_name(). К примеру, следующая инструкция объявляет курсор dyn_cursor, и для подготовки строки SQL инструкции stmt:

isc_dsql_set_cursor_name(status_vector, &stmt, "dyn_cursor", NULL);

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

3. Выберите строки с помощью isc_dsql_fetch () и сразу обработайте элементы списка выбора (столбцы), которые они содержит. Например, следующие цикл делает выбор одной строк  из dyn_cursor и сразу обрабатывают каждый элемент в выбранной строке с помощью определенной для приложения функцией, называемой process_column ():

while ( ( fetch_stat =isc_dsql_fetch(status_vector, &stmt, 1, out_sqlda) ) == 0 )

{

for (i = 0; i < out_sqlda->sqld; i++)

{

process_column(sqlda->sqlvar[i]);

}

}

if (fetch_stat != 100L)

{

/* isc_dsql_fetch возвращает 100, если нет больше строк оставшихся для выбора */

SQLCODE = isc_sqlcode(status_vector);

isc_print_sqlerror(SQLCODE, status_vector);

return(1);

}

4. Когда все строки выбраны закройте курсор с помощью isc_dsql_free_statement():

isc_dsql_free_statement(status_vector, &stmt, DSQL_close);  

<< Назад ] Содержание ] Далее >> ]

 

Дизайн: Piton Alien
Rambler's Top100 Рейтинг@Mail.ru
Сайт создан в системе uCoz