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



 

Чтобы осуществлять поиск элементов  списка выбора из подготовленной инструкции, строка должна быть выполнена в контексте курсора. Все объявления курсора в 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
Rambler's Top100 Рейтинг@Mail.ru
Сайт создан в системе uCoz