Учебно-справочное пособие по СУБД Informix

         

Курсоры



Курсоры

Если запрос к таблице возвращает несколько (больше одной) строк, то для их обработки используется так называемый курсор - указатель во множестве строк, выбранных оператором SELECT. Оператором DECLARE объявляется курсор для запроса, оператором OPEN этот запрос фактически выполняется и выбранные строки выделяются. Курсор устанавливается на первую из выбранных строк. С помощью оператора FETCH вы можете брать очередную строку, на которую указывает курсор, и помещать ее в свои программные переменные. Курсор после этого смещается на следующую строку.
С помощью конструкции циклической FOREACH имя_курсора ... END FOREACH можно перебрать все строки, выбранные оператором SELECT. Оператор OPEN в этом случае не нужен. DATABASE zawod DEFINE zap RECORD LIKE kadry.* DECLARE curs1 CURSOR FOR select * from kadry where datarovd>"9/25/1973"

# в цикле FOREACH выводим на экран все строки таблицы kadry, # в которых столбец datarovd содержит дату после 25 сентября # 1973 года. FOREACH curs1 INTO zap.* # Берем очередную строку и по- # мещаем ее в запись zap MESSAGE zap.* # Выводим запись zap на экран PROMPT "Еще ?" FOR CHAR c END FOREACH # Конец цикла FOREACH
В следующем примере строки выбираемые из таблицы kadry через курсор curs2 помещаются в массив z1 (но не более 100 строк). DATABASE zawod DEFINE z1 ARRAY[100] OF RECORD LIKE kadry.*, counter int

DECLARE curs2 CURSOR FOR SELECT * FROM kadry WHERE datarovd<"9/26/1973" OPEN curs2

FOR counter=1 TO 100

FETCH curs2 INTO z1[counter].* # взять очередную строку и поместить ее в следующий элемент # массива z1

IF status=NOTFOUND THEN # если выбранные сроки кончились, закончить цикл EXIT FOR END IF

END FOR

LET counter=counter-1 MESSAGE "В массив z1 прочитано ",counter, " записей"
Этот пример демонстрирует еще одно использование переменной status. Если оператор FETCH пытается взять сроку из курсора когда тот уже пуст, то значение переменной status устанавливается равным символической константе NOTFOUND, имеющей значение 100.
Поэтому можно проверять значение status после оператора FETCH и если оно равно 100, то прекратить чтение строк из опустевшего курсора.
В данном примере пользователь сам должен ввести условия, по которым будут найдены строки в таблице ceh. Он, например, может ввести: "nomerceh>15 and nomerceh<23". Программа прицепит это условие к строке, в которой записан SELECT оператор, получит строчку "SELECT * FROM ceh WHERE nomerceh>15 and nomerceh<23", изготовит из нее оператор, и для этого изготовленного оператора SELECT объявит курсор. Дальше действия аналогичны предыдущему примеру. DEFINE z2 ARRAY[100] OF RECORD LIKE ceh.*, counter int, simw char(200) PROMPT "допишите оператор SELECT * FROM ceh WHERE " FOR simw IF LENGTH(simw)=0 THEN LET simw="TRUE" END IF LET simw="SELECT * FROM ceh WHERE ", simw CLIPPED PREPARE st2 FROM simw DECLARE cs2 FOR st2

let counter=1 FOREACH cs2 INTO z2[counter].* LET counter=counter+1 IF counter>100 THEN EXIT FOREACH END IF END FOREACH LET counter=counter-1 MESSAGE "В массив z2 прочитано ",counter, " записей"


Содержание раздела