Выборка данных
После открытия курсора пользователь может приступать к выборке или изменению данных. Для считывания строки данных из курсора предназначена команда fetch, имеющая следующий синтаксис: FETCH [ [ NEXT I PRIOR I FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE [n | @nvar} ] FROM ] { { [GLOBAL] cursor__name } | @cursor_variable_name} [INTO @variable_name[,...n] ] Непосредственно после слова fetch указывается выбираемая строка, которую можно определить, указав либо ее абсолютную, либо относительную позицию. Затем следует ключевое слово from, за которым расположено имя курсора, из которого будут выбираться данные. После ключевого слова into указываются имена переменных, в которые будут помещены значения столбцов выбираемой строки курсора. Прежде чем выбрать данные, сервер выполняет переход на указанную строку. То есть сначала указанная строка становится текущей, и только после этого выполняется выборка данных. При этом возможен выход за пределы диапазона строк. Например, если текущей является последняя строка результирующего набора, а пользователь пытается выбрать следующую строку, то такая попытка закончится неудачей. Рассмотрим более подробно назначение параметр ов команды:
next — выполняет переход на следующую строку, располагающуюся в результирующем наборе непосредственно после текущей. Эта опция при первой выборке данных из курсора делает текущей первую строку результирующего набора и возвращает данные, хранящиеся в этой строке. Если пользователь не указывает явно, из какой строки будет выполняться выборка, то действует опция next, то есть данные будут считываться последовательно.
prior — в отличие от предыдущей опции, с помощью prior выполняется переход на предыдущую строку, из которой и считываются данные.
first — переход на самую первую строку результирующего набора курсора. Эта строка становится текущей, после чего из нее считываются данные.
last — переход на самую последнюю строку результирующего набора курсора. Эта строка становится текущей, после чего из нее считываются данные.
absolute — переход на строку с определенным номером (абсолютная адресация). Указанная строка становится текущей, и из нее считываются данные. Номер строки должен изменяться в пределах от 1 и до числа, соответствующего количеству строк в курсоре. Номер строки может быть указан двумя способами:
n — как константа, определяющая номер строки.
@nvar — как имя переменной, указывающей номер строки, на которую нужно перейти.
relative {n | @nvar} — в отличие от предыдущего параметра, устанавливающего текущую строку с указанным абсолютным номером, параметр relative позволяет делать текущей строку, расположенную на указанное число строк после или до текущей строки (относительная адресация). Подобно предыдущему параметру, смещение может указываться как с помощью константы, так и с помощью переменной. При этом смещение может быть как положительным, так и отрицательным. Положительное значение перемещает указатель текущей строки на указанное количество строк к концу результирующего набора, а отрицательное — к началу результирующего набора. Если смещение равно 0, указатель не смещается и повторно считывается текущая строка.
global — этот параметр необходим, если работа ведется с глобальным курсором, и в текущем соединении имеется еще и локальный курсор с таким же именем, что и локальный курсор. Если параметр global не указан, то считывание данных выполняется из локального курсора. Если имя курсора уникально (то есть имеется только один курсор с указанным именем), то параметр global не требуется.
cursor_name — имя курсора, из которого выполняется выборка данных. К моменту выборки курсор должен быть уже открыт. В противном случае будет выдано сообщение об ошибке.
@cursor_variabie_name — переменная, содержащая имя курсора. Позволяет динамически создавать множество курсоров.
@variabie_name[,...n] — имена переменных, в которые будут сохранены значения всех столбцов текущей строки курсора. Переменные должны быть предварительно объявлены и иметь тип данных, соответствующий типу данных столбцов курсоров. Возможно использование переменных типа данных, допускающего неявное преобразование типов данных столбцов курсора. Количество переменных, указанных после ключевого слова into, должно в точности соответствовать количеству столбцов курсора. Причем порядок указания переменных должен соответствовать порядку столбцов курсора.
Если в команде fetch не указывается ключевое слово into и, соответственно, не приведен список переменных, в которые будут сохранены значения текущей строки курсора, то команда fetch просто выводит соответствующие значения на экран, подобно команде select.
Приведем пример выборки данных из динамического курсора:
DECLARE curs1 CURSOR LOCAL DYNAMIC SCROLL READ_ONLY FOR SELECT au_id, au_lname, phone FROM authors WHERE state in ('CA', 'UT') OPEN cursi
DECLARE @ID char (11),@LName char(40), @Phone char(12)
FETCH FIRST FROM cursl INTO @ID, @LName, @Phone
SELECT [ID автора] = @ID, [Телефон] = OPhone, [Фамилия автора] = @LName FETCH NEXT FROM cursl INTO @ID, @LName, @Phone SELECT [ID автора] = @ID, [Телефон] = @Phone, [Фамилия автора] = @LName FETCH NEXT FROM cursl INTO @ID, @LName, @Phone SELECT [ID автора] = @ID, [Телефон] = @Phone, [Фамилия автора] = @LName FETCH NEXT FROM cursl FETCH NEXT FROM curs1 FETCH NEXT FROM cursl
Будет возвращен следующий результат:
ID автора Телефон Фамилия автора \ 172-32-1176 408 496-7223 White (1 row(s) affected)
ID автора Телефон Фамилия автора 213-46-8915 415 986-7020 Green (1 row(s) affected)
ID автора Телефон Фамилия автора 238-95-7766 415 548-7723 Carson (1 row(s) affected)
au__id au_lname phone 267-41-2394 O’Leary 408 286-2428 (1 row(s) affected)
au_id au_lname phone 274-80-9391 Straight 415 834-2919 (1 row(s) affected)
au_id au_lname phone 409-56-7008 Bennet 415 658-9932 (1 row(s) affected)
|