что такое курсоры в базах данных

Курсоры SQL Server

Курсоры позволяют усовершенствовать обработку результатов:

позиционируясь на отдельные строки результирующего набора;

получая одну или несколько строк от текущей позиции в результирующем наборе;

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

поддерживая разные уровни видимости изменений, сделанных другими пользователями для данных, представленных в результирующем наборе;

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

В некоторых сценариях при наличии первичного ключа для таблицы цикл WHILE может использоваться вместо курсора, что позволяет избежать недостатков, присущих курсорам. Однако существуют сценарии, когда курсоры не только неизбежны, но и действительно необходимы. В этом случае, если не требуется выполнять обновление таблиц с учетом курсора, используйте курсоры firehose, то есть курсоры быстрой прокрутки и только для чтения.

Реализации курсоров

SQL Server поддерживает три способа реализации курсоров.

курсоры Transact-SQL

Серверные курсоры интерфейса прикладного программирования (API)

Курсоры API поддерживают функции курсоров API в OLE DB и ODBC. Курсоры API реализуются на сервере. Всякий раз, когда клиентское приложение вызывает функцию курсора API, поставщик OLE DB или драйвер ODBC для собственного клиента SQL Server передает требование на сервер для выполнения действия в отношении серверного курсора API.

Клиентские курсоры

Клиентские курсоры реализуются внутренне драйвером ODBC для собственного клиента SQL Server и библиотекой DLL, реализующей API-интерфейс ADO. Клиентские курсоры реализуются посредством кэширования всех строк результирующего набора на клиенте. Каждый раз, когда клиентское приложение вызывает функцию курсора API, драйвер ODBC для собственного клиента SQL Server или ADO DLL выполняет операцию курсора на строках результирующего набора, кэшированных на клиенте.

Типы курсоров

SQL Server поддерживает четыре типа курсоров.

Курсоры могут использовать рабочие таблицы базы данных tempdb. Как и агрегирование или операции сортировки, которые выполняют сброс, они влияют на возможности ввода-вывода и являются потенциальным узким местом производительности. Курсоры STATIC используют рабочие таблицы с начала действия. Дополнительные сведения см. в описании рабочих таблиц в руководстве по архитектуре обработки запросов.

Однонаправленный

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

Хотя в моделях курсоров API базы данных курсор последовательного доступа рассматривается как курсор отдельного типа, в SQL Server принят другой подход. SQL Server принимает однонаправленность и возможность прокрутки курсоров как параметры, которые могут быть применены к статическим, управляемым набором ключей и динамическим курсорам. Transact-SQL курсоры поддерживают однонаправленные статические, управляемые набором ключей и динамические курсоры. Модели курсора API базы данных предполагают, что статические, управляемые набором ключей и динамические курсоры всегда могут быть прокручены. Если атрибут или свойство курсора API базы данных установлены в значение «однонаправленный», SQL Server реализует это как однонаправленный динамический курсор.

Статические

Полный результирующий набор статического курсора создается в базе данных tempdb при открытии курсора. Статический курсор всегда отображает результирующий набор точно в том виде, в котором он был при открытии курсора. Статическими курсорами обнаруживаются лишь некоторые изменения или не обнаруживаются вовсе, но при этом в процессе прокрутки такие курсоры потребляют сравнительно мало ресурсов.

SQL Server статические курсоры всегда доступны только для чтения.

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

Transact-SQL использует для описания статических курсоров термин «нечувствительный». Некоторые интерфейсы API баз данных называют их курсорами моментальных снимков.

Keyset

Членство и порядок строк в курсоре, управляемом набором ключей, являются фиксированными при открытии курсора. Такие курсоры управляются с помощью набора уникальных идентификаторов — ключей. Ключи создаются из набора столбцов, который уникально идентифицирует строки результирующего набора. Набор ключей — это набор ключевых значений всех строк, попадающих под действие инструкции SELECT на момент открытия курсора. Набор ключей, управляющий курсором, создается в базе данных tempdb при открытии курсора.

Динамический

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

Запрос курсора

SQL Server поддерживает два метода запроса курсоров.

Язык Transact-SQL поддерживает синтаксис для использования курсоров, созданных в соответствии с синтаксисом курсоров ISO.

API-функции курсоров базы данных.

SQL Server поддерживает функциональность курсоров для следующих API-интерфейсов баз данных:

ADO (Microsoft ActiveX Data Object);

открытый интерфейс доступа к базам данных (ODBC).

Обработка курсоров

Transact-SQL и API-курсоры имеют различный синтаксис, но для всех курсоров SQL Server используется одинаковый цикл обработки.

Связать курсор с результирующим набором инструкции Transact-SQL и задать его характеристики (например возможность обновления строк).

Выполнить инструкцию Transact-SQL для заполнения курсора.

Получить в курсор необходимые строки. Операция получения в курсор одной и более строк называется выборкой. Выполнение серии выборок для получения строк в прямом или обратном направлении называется прокруткой.

При необходимости выполнить операции изменения (обновления или удаления) строки в текущей позиции курсора.

Источник

Введение в процедуры и курсоры в SQL

Дата публикации Nov 17, 2018

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Узнайте, как писать процедуры и курсоры дляRDBMS,

Если вы хотите больше узнать о SQL с точки зрения Data Science, вы можете воспользоваться бесплатной программой DataCamp.«Введение в SQL для науки о данных»курс.

Как специалист по данным, очень важно знать SQL и связанные с ним методы. Для того, чтобы иметь возможность запрашивать СУБД и получать ответы на конкретные вопросы о данных, с которыми вы будете иметь дело, SQL является минимальной необходимостью.

В своем последнем видео с DataCamp,Дэвид Робинсон(Главный специалист по данным @ DataCamp)показал нам, как он использует SQL в задаче Data Science, Пожалуйста, проверьте это, его рабочий процесс очень интересен.

В этом уроке вы узнаете:

Звучит увлекательно? Давайте начнем.

Что такое процедура в СУРБД?

Прежде чем приступить к процедурам и курсорам, вам нужно немного узнать о PL/SQL это язык с блочной структурой, который позволяет таким разработчикам, как вы, сочетать мощь SQL с процедурными выражениями. Но вы не будете учиться обычным способом, вы узнаете это по ходу дела и по мере необходимости.

Теперь вы увидите, как написать процедуру.

Написание процедуры:

Общий синтаксис написания процедуры выглядит следующим образом:

Обратите внимание, что эти синтаксисы применимы практически к любой СУБД, будь то Oracle, будь то PostgreSQL или MySQL.

После того, как вы создали процедуру, вам придется ее выполнить. Ниже приводится синтаксис для этого.

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

казнить SelectAllCustomers по:

Процедуры также могут быть автономными блоками операторов, что делает их независимыми от любых таблиц в отличие от предыдущей. В следующем примере создается простая процедура, которая отображает строку «Hello World!» В качестве вывода при выполнении.

Существует два способа выполнения отдельной процедуры.

Вышеуказанная процедура с именем «welcome» может быть вызвана с EXEC Ключевое слово как:

Теперь вы увидите следующий метод, то есть вызов процедуры из другого блока PL / SQL.

Процедура также может быть заменена. Вам просто нужно добавить REPLACE Ключевое слово при создании процедуры. Это заменит уже существующую процедуру (если), иначе создаст новую.

Удаление хранимой процедуры не составляет большого труда:

Процедуры могут отличаться в зависимости от параметров. Могут быть процедуры с одним параметром, а также процедуры с несколькими параметрами. Теперь вы будете изучать эти варианты.

Вы будете использовать ту же таблицу Customers за это. Для вашего удобства снимок приведен снова в следующем разделе.

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Вы напишите хранимую процедуру, которая выбирает клиентов из определенного города из таблицы:

Давайте рассмотрим общие принципы здесь:

Процедура выполняется как:

Давайте посмотрим другой вариант сейчас.

Написание процедур снесколько параметровточно так же, как и предыдущий. Вам просто нужно добавить их.

Выполните процедуру как:

Разве вышеприведенные коды не очень удобочитаемы? Когда код читается, это веселее. Это все для процедур Теперь вы будете изучать курсоры.

Что такое курсор в РСУБД?

Курсоры могут быть двух типов:

Теперь вы увидите, как писать разные типы курсоров.

Написание курсоров:

Вы начнете с этого раздела, поняв, что такое неявные курсоры.

Неявные курсорысоздаются автоматически Oracle всякий раз, когда выполняется оператор SQL, когда для оператора не определен явный курсор. Программисты не могут контролировать неявные курсоры и информацию в них. Всякий раз, когда выдается оператор DML (язык манипулирования данными) (INSERT, UPDATE и DELETE), с этим оператором связывается неявный курсор. Для операций INSERT курсор содержит данные, которые необходимо вставить. Для операций UPDATE и DELETE курсор определяет строки, которые будут затронуты.

Вы можете ссылаться на самый последний неявный курсор как на курсор SQL, который всегда имеет такие атрибуты, как:

Следующее изображение кратко описывает эти атрибуты:

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Давайте рассмотрим снимок базы данных, состоящей из таблицы под названием Employee :

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Теперь вы напишите курсор, который увеличит зарплату на 1000 человек тех, чей возраст меньше 30 лет.

Давайте теперь рассмотрим то, что вы написали:

Большой! У тебя все хорошо!

Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат:

2 сотрудника обновлены (предположим, что есть 2 записи, где возраст

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Теперь вы узнаете больше о каждом из этих шагов.

Объявление курсора:

Вы объявляете курсор вместе с SELECT заявление. Например:

Открытие курсора:

Когда вы открываете курсор, CPU выделяет память для курсора и делает его готовым для выборки строк, возвращаемых оператором SQL, который в него влечет. Например, мы откроем выше определенный курсор следующим образом:

Выбор курсора:

Извлечение курсора включает в себя доступ к одной строке за раз из связанной таблицы в SQL-коде, введенном для курсора.

Закрытие курсора:

Закрытие курсора означает освобождение выделенной памяти. Вы закроете выше открытый курсор как:

Теперь вы сложите все эти кусочки осмысленно.

Сборка этих частей:

Используя LOOP Вы перебрали курсор, извлекли записи и отобразили их. Вы также обработали случай, если курсор не нашел записи.

Когда код выполняется в командной строке SQL, он выдает:

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Вывод:

Ниже приведены некоторые ссылки, которые были взяты для написания этого урока:

Источник

Курсоры в хранимых процедурах MySQL

После предыдущей статьи о хранимых процедурах, я получил целый ряд комментариев. В одном из них читатель попросил меня уделить больше внимания курсорам, одному из важных элементов хранимых процедур.

Так как курсоры являются частью хранимой процедуры, то в этой статье мы еще детальнее рассмотрим ХП. В частности, как извлечь из ХП набор данных.

Что такое курсор?

С помощью курсора мы можем перебрать набор данных и обработать каждую запись в соответствии с определенными задачами.

Такая операция по обработке записи может быть также исполнена на PHP-уровне, что значительно уменьшает объем передаваемых на PHP-уровень данных, так как мы можем просто вернуть обработанный сводный / статистический результат обратно (тем самым устраняя процесс обработки select – foreach на стороне клиента).

Поскольку курсор реализуется в хранимой процедуре, он имеет все преимущества (и недостатки), присущие ХП (контроль доступа, пре-компиляция, трудность отладки и т.д.)

Пример практического применения

Структура таблицы этой страницы довольно проста:

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Рис 1. Структура таблицы результатов игр Лейкерс

Я заполняю эту таблицу с 2008 года. Некоторые из последних записей с результатами игр Лейкерс в сезоне 2013-14 приведены ниже:

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Рис. 2. Данные таблицы результатов игр Лейкерс (частичные) в сезоне 2013-2014

(Я использую MySQL Workbench в качестве GUI-инструмента для управления базой данных MySQL. Вы можете использовать другой инструмент по своему выбору).

Что ж, должен признать, что баскетболисты Лейкерс в последнее время играют не очень здорово. 6 поражений подряд по состоянию на 15 января. Я определил эти « 6 поражений подряд », посчитав вручную, сколько матчей подряд, начиная с текущей даты (и вниз к более ранним играм) имеют в колонке winlose значение « L » (поражение).

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

Можем ли мы сделать то же самое с помощью одного оператора SQL? Я не являюсь экспертом SQL, потому не смог придумать, как достичь нужного результата (« 6 поражений подряд ») через один оператор SQL. Мнения гуру будут для меня очень ценными — оставьте их в комментариях ниже.

Можем ли мы сделать это через PHP? Да, конечно. Мы можем получить данные по играм (конкретно, столбец winlos ) этого сезона и перебрать записи для вычисления длительности текущей серии побед / поражений подряд.

Но чтобы сделать это, нам придется охватить все данные за этот год и большая часть данных будет для нас бесполезна (не слишком вероятно, что какая-то команда будет иметь серию длиннее, чем 20+ игр подряд в регулярном сезоне, который состоит из 82 матчей).

Тем не менее, мы не знаем наверняка, сколько записей должно быть извлечено в PHP для определения серии. Так что нам не обойтись без напрасного извлечения ненужных данных. И, наконец, если текущее количество выигрышей /поражений подряд это единственное, что мы хотим узнать из этой таблицы, зачем нам тогда извлекать все строки данных?

Можем ли мы сделать это другим способом? Да, это возможно. Например, мы можем создать резервную таблицу, специально предназначенную для хранения текущего значения количества побед /поражений подряд.

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

Так как же можно сделать это лучше?

Использование курсора в хранимой процедуре

Как вы могли догадаться из названия нынешней статьи, лучшей альтернативой (на мой взгляд) для решения этой проблемы является использование курсора в хранимой процедуре.

Давайте создадим в MySQL Workbench первую ХП:

В этой ХП у нас есть один входящий параметр и два исходящих. Это определяет подпись ХП.

В теле ХП мы также объявили несколько локальных переменных для серии результатов (выигрышей или проигрышей, current_win ), текущей серии и текущего статуса выигрыш /проигрыш конкретного матча:

Эта строка является объявлением курсора. Мы объявили курсор с именем cur и набор данных, связанных с этим курсором, который является статусом победа /поражение для тех матчей (значение столбца winlose может быть либо « W », либо « L », но не пустое) в конкретном году, которые упорядочены по идентификатору id (последние сыгранные игры будут иметь более высокий ID) в порядке убывания.

Хотя это не видно наглядно, но мы можем себе представить, что этот набор данных будет содержать последовательность значений « L » и « W ». На основании данных, приведенных на рисунке 2, она должна быть следующей: « LLLLLLWLL… » (6 значений « L », 1 « W » и т.д.)

Для расчета количества побед / поражений подряд мы начинаем с последнего (и первого в приведенном наборе данных) матча. Когда курсор открыт, он всегда начинается с первой записи в соответствующем наборе данных.

После того, как первые данные загружены, курсор перемещается к следующей записи. Таким образом, поведение курсора похоже на очередь, перебирающую набор данных по системе FIFO (First In First Out). Это именно то, что нам нужно.

После получения текущего статуса победа / поражение и количества последовательных одинаковых элементов в наборе, мы продолжаем обрабатывать по циклу (перебирать) оставшуюся часть набора данных. В каждой итерации цикла курсор будет « переходить » на следующую запись, пока мы не разорвем цикл или пока все записи не будут перебраны.

Если статус следующей записи такой же, как у текущего последовательного набора побед / поражений, это означает, что серия продолжается, тогда мы увеличиваем количество последовательных побед (или поражений) еще на 1 и продолжаем перебирать данные.

Если статус отличается, это означает, что серия прервана, и мы можем остановить цикл. Наконец, мы закрываем курсор и оставляем исходные данные. После этого выводится результат.

Далее мы можем повысить контроль доступа ХП, как это описано в моей предыдущей статье.

Чтобы проверить работу этой ХП, мы можем написать короткий PHP-скрипт:

Результат обработки должен выглядеть приблизительно так, как показано на следующем рисунке:

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

(Этот результат основан на данных по играм « Лейкерс » по состоянию на 15 января 2014 года).

Вывод набора данных из хранимой процедуры

Несколько раз по ходу этой статьи разговор касался того, как вывести набор данных из ХП, которая составляет набор данных из результатов обработки нескольких последовательных вызовов другой ХП.

Пользователь может захотеть получить с помощью ранее созданной нами ХП больше информации, чем просто непрерывная серия побед / поражений за год; например мы можем сформировать таблицу, в которой будут выводиться серии побед /поражений за разные годы:

(В принципе, более полезной информацией будет длительность самой длинной серии побед или поражений в определенном сезоне. Для решения этой задачи можно легко расширить описанную ХП, поэтому я оставлю эту задачу тем читателям, кому это будет интересно. В рамках текущей статьи мы продолжим обработку текущей серии побед / поражений).

Хранимые процедуры MySQL могут возвращать только скалярные значения (целое число, строку, и т.д.), в отличие от операторов select … from … (результаты преобразуются в набор данных). Проблема в том, что таблица, в которой мы хотим получить результаты, в существующей структуре базы данных не существует, она составляется из результатов обработки хранимой процедуры.

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

Сначала мы создадим вторую ХП, код которой показан ниже:

Несколько существенных замечаний к приведенному выше коду:

Чтобы получить результаты, мы создаем еще один небольшой PHP-скрипт, код которого показан ниже:

Выведенные на экран результаты будут выглядеть приблизительно следующим образом:

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Обратите внимание, что приведенный выше способ немного отличается от вызова нашей первой ХП.

Вуаля! Мы сделали это!

Заключение

В этой статье мы продолжили изучение хранимых процедур MySQL и рассмотрели применение курсоров. Мы рассказали, как извлечь скалярные данные с помощью выходных параметров (определяемых как out var_name vartype в объявлении ХП), а также как выводить результативный набор данных через временную таблицу. По ходу данной статьи мы также коснулись различных вариантов применения операторов в хранимых процедурах.

Не стесняйтесь оставлять комментарии, пишите, что вы думаете по этому поводу!

Источник

Учебное пособие по курсору MySQL и пример кода

В этом руководстве вы найдете краткое описание использования курсоров MySQL в хранимой процедуре, хранимых функциях или триггерах для выполнения результата оператора SELECT.

В большинстве случаев при выполнении SQL-запросов с использованием оболочки MySQL или рабочей среды MySQL мы не сохраняем результаты, хотя у нас есть возможность сохранять результаты, обработанные сервером с помощью хранимой процедуры.

А также в этом руководстве я не буду обсуждать хранимые процедуры, функции или триггеры. Вместо этого я просто покажу вам, как можно использовать курсоры MySQL для выполнения результатов в хранимых процедурах.

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

Особенности курсора MySQL

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

Основное использование

Общий синтаксис объявления курсора в MySQL прост. Начнем с использования ключевого слова DECLARE, как показано в примере запроса ниже/

Как объявить курсор

Имя_курсора — это имя, присвоенное курсору во время объявления. Обратите внимание, что объявление курсора должно быть после любых объявленных переменных, чтобы MySQL не приводил к ошибкам.

Далее идет SELECT_expression, в котором хранится оператор SELECT, связанный с курсором.

Как открыть курсор

Как только у нас объявлен курсор и MySQL знает, что курсор существует, мы можем начать его использовать, что требует открытия курсора.

Общий синтаксис для открытия курсора показан в запросе ниже:

Эта команда открывает курсоры, на которые ссылается ее имя, и ее можно использовать.

Как получить данные

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

Общий синтаксис для выборки данных с помощью курсора следующий:

ПРИМЕЧАНИЕ. Как уже упоминалось, убедитесь, что курсор используется после объявления переменных, чтобы избежать ошибок.

Как закрыть и отпустить курсор

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

После того, как курсор был закрыт, пользователю необходимо повторно открыть курсор, используя ключевые слова OPEN (показанные выше), прежде чем использовать курсор.

Вам не нужно объявлять курсор после оператора закрытия.

Общий синтаксис закрытия курсора показан в запросе ниже:

Обработка ошибок

Курсор MySQL работает, рекурсивно считывая следующую строку в наборе результатов. Если следующая строка недоступна, курсор закроется и не вернет данные, если не указано иное. Это может быть проблемой, особенно после того, как курсор достигнет конца результата.

В качестве решения определяется обработчик NOT FOUND. Это указывает действие, которое необходимо предпринять, если следующая строка не найдена.

Общий синтаксис обработки ошибок при использовании курсора:

Конечное значение — это переменная, используемая для указания того, что курсор достиг конца результата. Имя переменной может быть любым, если оно соответствует соглашению об именах переменных MySQL.

ПРИМЕЧАНИЕ. Как и все переменные, используемые в курсоре, она должна быть определена до использования в курсоре.

Пример использования

Давайте создадим курсор, который собирает электронные письма клиентов, доступные в таблице клиентов образца базы данных Sakila.

Ресурс для загрузки и установки базы данных Sakila находится ниже:

Ниже показана процедура, в которой для получения писем используется курсор:

После выполнения запроса вы получите результат, как показано ниже:

что такое курсоры в базах данных. Смотреть фото что такое курсоры в базах данных. Смотреть картинку что такое курсоры в базах данных. Картинка про что такое курсоры в базах данных. Фото что такое курсоры в базах данных

Заключение

В этом руководстве мы рассмотрели использование курсоров MySQL для анализа данных, хранящихся в наборе результатов. Изучите документацию, чтобы понять, как реализовать курсоры.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *