LINUX.ORG.RU

я не понял суть вопроса, но могу обрадовать, что курсоры открываются при каждом селекте.

Pi ★★★★★
()
Ответ на: комментарий от Pi

>я не понял суть вопроса, но могу обрадовать, что курсоры открываются при каждом селекте.

нужно придумать хранимую процедуру, которая без использования курсоров не реализуется и реализовать с помощью курсоров.

ЗЫ у меня лабораторная.

anonymous
()

ну например бывают слишком сложные обработки.
которые в один апдейт не опишешь.
можно написать:


begin
for c1rec in (select .... ) loop
update ... where ...=c1rec.id;
end loop;
end;

у меня такое было когда обрабатывалсь денежные данные и
курс со ставкой считались для каждой транзакции.

vahvarh ★★★
()
Ответ на: комментарий от anonymous

//Процедура, использующая обработку курсора
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

anonymous
()
Ответ на: комментарий от anonymous

> /* Процедура подсчитывает количество книг
> взятых, читателем "Петрова В.А.", которые
> изданы в издательстве "Советское радио" */


Ужос. За это вы скорее получите незачет за не знакомство с агрегатной функции COUNT().

А потом вот такие вот граждане орут "MySQL и SQLite - это недостаточно энтерпрайз, там хранимых процедур нет"...

gods-little-toy ★★★
()
Ответ на: комментарий от vahvarh

Еще курсорами часто всякие набегающие параметры считают. Например, топикстартеру надо обокрасть библиотеку, и он ищет самые ценные книги

(SELECT isbn, title, weight WHERE location == 'плохо охраняемый чулан' ORDER BY price DESC)

и дальше нагребает пока общая масса не превысит заданную величину.

Такое на простом SQL не сделать... cуществуют статистические аддоны с похожими функциями, но их наличие в базе не гарантировано...

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

> Еще курсорами часто всякие набегающие параметры считают. Например, топикстартеру надо обокрасть библиотеку, и он ищет самые ценные книги

А просто поменяв имена полей в этом алгоритме, мы получим списание по методу FIFO :-)

gdv2
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.