Курсор — это запрос к базе данных, хранящийся на сервере MySQL. Это не оператор SELECT, а набор результатов, полученный этим оператором. После сохранения курсора приложение может прокручивать или просматривать данные внутри него по мере необходимости.
Примечание. Курсоры MySQL можно использовать в хранимых процедурах, функциях, триггерах и событиях.
Перед созданием курсора нам необходимо очистить синтаксис курсора.
1. Определите курсор
Имя курсора DECLARE CURSOR FOR SQL-оператор;
2. Откройте курсор
имя курсора OPEN;
3. Получите результаты
FETCH имя курсора INTO имя переменной[, имя переменной];
4. Закройте курсор
Имя курсора ЗАКРЫТЬ;
В качестве примера возьмем таблицу «Клиенты».
Определите хранимую процедуру и выполните курсор внутри нее при вызове
CREATE PROCEDURE PROC1()
BEGIN
-- Определите две переменные для хранения результатов
DECLARE NAME VARCHAR(20);
DECLARE ADDR VARCHAR(50);
-- Объявить курсор
DECLARE MY CURSOR FOR SELECT имя, адрес FROM customers;
-- открытый курсор
OPEN MY;
-- Получите результаты
FETCH MY INTO NAME,ADDR;
-- Вот чтобы показать получение результаты
SELECT NAME,ADDR;
-- Закрыть курсор
CLOSE MY;
END;
После выполнения указанной выше хранимой процедуры мы можем вызвать хранимую процедуру.
CALL PROC1();
Получите результат:
Здесь наверняка есть друзья, которым интересно. В таблице клиентов явно 7 записей, почему отображается только 1 запись?
Это связано с тем, что переменная курсора сохраняет только первую строку данных в таблице клиентов. Если вы хотите просмотреть последующие данные, вам нужно циклически перемещать курсор вниз, чтобы продолжить просмотр.
Определите хранимую процедуру. При вызове хранимой процедуры данные из таблицы клиентов будут циклически записываться в новую таблицу.
CREATE PROCEDURE PROC2()
BEGIN
-- Определите две переменные для хранения результатов
DECLARE FLAG INT DEFAULT 0;
DECLARE NAME VARCHAR(20);
DECLARE ADDR VARCHAR(50);
-- Объявить курсор
DECLARE MY CURSOR FOR SELECT имя, адрес FROM customers;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG=1;
-- открытый курсор
OPEN MY;
-- петля часть тела
L1:LOOP
-- Получите результаты
FETCH MY INTO NAME,ADDR;
IF FLAG=1 THEN
LEAVE L1;
END IF;
-- Вот чтобы показать получение результаты
INSERT INTO cus VALUES(NAME,ADDR);
-- Закрыть курсор
END LOOP; -- конец цикла
CLOSE MY;
END;
Затем мы выполняем эту хранимую процедуру и запрашиваем данные в таблице cus.
CALL PROC2();SELECT * FROM cus;
результат:
Результаты совпадают с результатами у клиентов, но эти результаты вставляются при движении цикла вниз один за другим, то есть этот цикл выполняется 7 раз.
Вышеуказанное является основным принципом работы курсора. Кроме того, тело цикла курсора также имеет методы работы, такие как WHILE и REPEAT. Их методы работы аналогичны LOOP, и они используются для выполнения содержимого тела цикла. циклически до конца цикла.
Когда мы запрашиваем данные через sql,
1. Обычный способ — отправить оператор SQL, и сервер вернет вам все данные. Другой способ.
2. Метод курсора. Метод курсора находит запрашиваемые данные на стороне сервера и затем возвращает их вам в пакетном режиме. Этот метод подходит для сценариев, когда сервер должен обрабатывать большой объем оперативных данных. мне один кусок, а я обрабатываю один кусок, а потом продолжаю обработку в цикле. В конце клиент не получит все данные сразу.
Первый метод вызовет проблемы с утечкой памяти.
Второго не будет, но он будет занимать ссылку на сервер надолго.
Простое понимание курсора таково: сообщить серверу набор результатов данных, который я хочу запросить, а затем вернуть его мне пакетами для медленной обработки.