//Процедура, использующая обработку курсора
CREATE PROCEDURE Count_publishers
/* Процедура подсчитывает количество книг
взятых, читателем "Петрова В.А.", которые
изданы в издательстве "Советское радио" */
(
OUT Par_count_publishers SMALLINT
)
BEGIN
DECLARE Err_not_found //Декларируем
EXCEPTION FOR //ситуацию выхода
SQLSTATE '02000'; //за пределы курсора
DECLARE
N_Petrova SMALLINT; //№ читательской
//карточки читателя "Петрова В.А."
// Объявление переменных для хранения
// значений полей текущей записи курсора
DECLARE Tek_Author CHAR(20);
DECLARE Tek_Title_book CHAR(100);
DECLARE Tek_City_publish CHAR(15);
DECLARE Tek_Publisher CHAR(20);
DECLARE Tek_Year_publish SMALLINT;
DECLARE //Объявление курсора Rez_cursor
Rez_cursor // для результирующего множества,
CURSOR FOR //формируемого процедурой
CALL Get_list_absent(N_Petrova);
SET //Обнуляем счетчик взятых книг
Par_count_publishers = 0;
/* Определяем № читательской карточки
читателя Петровой В.А. */
SELECT Reader.N_reader
INTO N_Petrova
FROM Stepanov.Reader
WHERE Reader.Name_reader =
'Петрова В.А.';
//Открываем курсор Rez_cursor с
//результирующим множеством
// процедуры Get_list_absent
OPEN Rez_cursor;
//Последовательно обрабытываем все
//записи курсора Rez_cursor
Work_for_kurs_loop: //метка цикла
LOOP
//Перемещаем указатель текущей записи
//курсора на следующую запись. При этом
//содержимое все полей записываются в
//предназначенне для этого переменные
FETCH NEXT Rez_cursor
INTO Tek_Author, Tek_Title_book,
Tek_City_publish, Tek_Publisher,
Tek_Year_publish;
IF SQLSTATE = Err_not_found
THEN //В случае если произошел выход за
//пределы курсора, то завершается
//работа цикла Work_for_kurs_loop
LEAVE Work_for_kurs_loop;
END IF;
IF Tek_Publisher = 'Советское радио'
THEN
SET Par_count_publishers=
Par_count_publishers+1;
END IF;
END LOOP Work_for_kurs_loop;
//конец цикла
CLOSE Rez_cursor;
END