|
|
Чтобы
осуществлять поиск элементов
списка выбора из подготовленной
инструкции, строка должна быть выполнена в
контексте курсора. Все объявления курсора в
InterBase – это фиксированные инструкции,
вставленные в приложение прежде, чем оно
будет откомпилировано. Разработчики DSQL
приложений должны
предупреждать потребность в курсорах при
написании приложения и объявлять их
заранее. Курсор
необходим, чтобы обработать
позиционированные инструкции UPDATE И DELETE,
сделанные для строк, выбранных с помощью
isc_dsql_fetch () для инструкций SELECT, которые
определяют необязательное предложение FOR
UPDATE OF. Следующее
описание рассматривает ситуации когда
курсор необходим. Конструкция
выполнения цикла выбора используется,
чтобы выбрать отдельную строку из курсора и
обработать каждый элемент списка выбора (столбец)
в этой строке до выбора следующей строки.
Выполняйте строку -
инструкцию в контексте курсора и выбирайте
строки элементов списка выбора по
следующим шагам: 1.
Выполните подготовленную инструкцию с
помощью isc_dsql_execute(): isc_dsql_execute(status_vector,
&trans, &stmt, 1, NULL); 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); } Process_column
() - функция упомянутая в этом примере
обрабатывает каждый возвращенный элемент
списка выбора. Следующий код иллюстрирует,
как такая функция может быть написана: void
process_column(XSQLVAR *var) { /*
проверка на NULL
значение
*/ if
((var->sqltype & 1) && (*(var->sqlind) = -1)) { /*
Здесь определяется NULL
значение */ } else { /*
обработка данных*/ } .
. . } 4.
Когда все строки выбраны курсор
закройте с помощью isc_dsql_free_statement(): isc_dsql_free_statement(status_vector,
&stmt, DSQL_close);
|
Дизайн: Piton Alien |