Понятие курсора

Все select-запросы можно разделить на 2 группы:

  1. select-запрос всегда возвращает строго одну запись выборки данных;

  2. select-запрос возвращает, в общем случае, множество записей выборки данных.

Если select-запрос к БД возвращает множественную выборку данных, то одним из способов работы с таким запросом является выборка данных в массивы переменных. Этот метод можно использовать, когда объем выборки незначителен (или запрос сконструирован таким образом, что возвращает данные небольшими порциями), количество выбираемых записей заранее известно, а выбираемые записи данных имеют небольшую длину. В этом случае прямой доступ к любой возвращенной записи выборки данных выполняется по индексированному номеру массива. В ситуации, когда возвращается достаточно большое количество записей выборки данных или общее количество записей выборки данных неизвестно, и невозможна порционная выборка записей, метод массивов становится неприемлемым. Для работы с такими запросами встроенный SQL имеет специальную структуру данных, называемую курсор. Курсор, по существу, представляет собой имя многострочного запроса или имя таблицы, получаемой в результате выборки данных. Подобно тому, как по имени и индексу массива можно получить доступ к любой загруженной в массив записи, по имени курсора и по индексу записи в курсоре можно получить доступ к любой записи множественной выборки. Однако если при использовании метода массивов процесс выборки данных из БД не может быть прерван или приостановлен до полного заполнения массива или исчерпания выборки, то курсор можно использовать для обработки отдельных записей выборки данных возвращаемого запросом набора. Записи обрабатываются по одной в том порядке, в котором СУБД ЛИНТЕР возвращает их из БД. Процесс выборки может быть прерван в любой момент времени (например, когда необходимые данные найдены). Механизм курсоров позволяет также реализовать одновременное выполнение нескольких SQL-запросов, возвращающих множественные выборки данных. Одновременное выполнение понимается как поочередное выполнение одного курсора внутри другого. Так как работа с множественными выборками записей при использовании курсоров может представлять собой довольно длительный процесс, то он управляется пользовательской программой, а не СУБД. Для этого встроенный SQL имеет следующие команды управления курсором:

  • начать работу с курсором (открыть курсор);

  • выбрать указанную запись из множественной выборки данных;

  • закончить работу с курсором (закрыть курсор).

Имена курсоров могут задаваться идентификаторами, строками встроенного языка и переменными основного языка.

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

Имя курсорной переменной, заданной идентификатором встроенного языка или строкой встроенного языка, может использоваться в конструкции CURRENT OF < имя курсора > при подготовке предложения встроенного языка (PREPARE) в том случае, если предложение SQL задается непосредственно. Это связано с тем, что курсоры встроенного SQL имеют имена, не совпадающие с именами физических курсоров СУБД ЛИНТЕР.

Курсор с именем < имя курсора > должен быть описан ранее в операторе DECLARE CURSOR, открыт оператором OPEN и позиционирован оператором FETCH.