|
|
Чтобы
возвратить элементы списка выборки строки
инструкции, строка должна быть выполнена в
пределах контекста курсора. Все объявления
курсора в 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 |