Как выходить из курсора в ms sql
Перейти к содержимому

Как выходить из курсора в ms sql

  • автор:

sp_cursor_list (Transact-SQL)

Представляет атрибуты серверных курсоров, открытых на данный момент для соединения.

Синтаксис

 sp_cursor_list [ @cursor_return = ] cursor_variable_name OUTPUT , [ @cursor_scope = ] cursor_scope [;] 

Аргументы

[ ] @cursor_return=cursor_variable_nameВЫХОДНЫЕ ДАННЫЕ
Имя объявленной переменной курсора. cursor_variable_name является курсором без значения по умолчанию. Этот аргумент является динамическим, прокручиваемым и предназначенным только для чтения.

[ ] @cursor_scope=cursor_scope
Определяет, какие уровни курсоров включаются в отчет. cursor_scope является int , без значения по умолчанию и может быть одним из этих значений.

значение Description
1 Представить все локальные курсоры.
2 Представить все глобальные курсоры.
3 Представить как локальные, так и глобальные курсоры.

Значения кода возврата

Возвращенные курсоры

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

Формат курсора, возвращаемого хранимой процедурой sp_cursor_list. Формат курсора такой же, как и формат, возвращаемый хранимой процедурой sp_describe_cursor.

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

0 = курсор, указанный ссылкой в имени или переменной курсора, открыт, но не имеет строк. Динамические курсоры не возвращают это значение.

-1 = курсор, указанный ссылкой в имени или переменной курсора, закрывается.

-2 = применимо только к переменным курсора. Нет курсора, назначенного переменной. Возможно, параметр OUTPUT назначил курсор переменной, но хранимая процедура закрыла курсор перед возвратом.

2 = набор ключей

2 = блокирование прокрутки

0 = выборка завершена успешно.

-1 = выборка завершена с ошибкой или вышла за пределы курсора.

-2 = запрошенная строка отсутствует.

0 = операции c курсором не выполнялись.

Замечания

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

  • Курсоры Transact-SQL Server.
  • Курсоры сервера API, открытые приложением ODBC, которое затем называется SQLSetCursorName для имени курсора.

Используйте процедуру sp_describe_cursor_columns для описания атрибутов результирующего набора, возвращаемого курсором. Процедура sp_describe_cursor_tables используется для получения отчета по базовым таблицам, на которые ссылается курсор. sp_describe_cursor сообщает те же сведения, что и sp_cursor_list, но только для указанного курсора.

Разрешения

Разрешения на выполнение по умолчанию принадлежит роли public.

Примеры

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

USE AdventureWorks2022; GO -- Declare and open a keyset-driven cursor. DECLARE abc CURSOR KEYSET FOR SELECT LastName FROM Person.Person WHERE LastName LIKE 'S%'; OPEN abc; -- Declare a cursor variable to hold the cursor output variable -- from sp_cursor_list. DECLARE @Report CURSOR; -- Execute sp_cursor_list into the cursor variable. EXEC master.dbo.sp_cursor_list @cursor_return = @Report OUTPUT, @cursor_scope = 2; -- Fetch all the rows from the sp_cursor_list output cursor. FETCH NEXT from @Report; WHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT from @Report; END -- Close and deallocate the cursor from sp_cursor_list. CLOSE @Report; DEALLOCATE @Report; GO -- Close and deallocate the original cursor. CLOSE abc; DEALLOCATE abc; GO 

Использование курсора для запроса значений MS SQL

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

create table MyTab (t1 int not null, t2 float not null, t3 datetime not null, t4 nvarchar(max) not null); insert into MyTab (t1, t2, t3, t4) values (1, 2.5, '2022-11-10 15:00:00', 'aa'), (2, 3.5, '2022-11-11 16:00:00', 'bb'), (3, 4.5, '2022-11-12 17:00:00', 'cc'), (4, 1.5, '2022-11-15 10:00:00', 'dd'); 

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

declare m_cursor scroll cursor for (select * from MyTab) declare @c1 int, @c2 float, @c3 datetime2(0), @c4 nvarchar(2) open m_cursor fetch first from m_cursor into @c1, @c2, @c3, @c4 print @c1 + ' ' @c2 + ' ' + @c3 + ' ' + @c4 while @@fetch_status = 0 begin fetch next from m_cursor into @c1, @c2, @c3, @c4 print @c1 + ' ' + @c2 + ' ' + @c3 + ' ' + @c4 end close m_cursor deallocate m_cursor; 

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

1 2.5 2022-11-10 15:00:00 aa 2 3.5 2022-11-11 16:00:00 bb 3 4.5 2022-11-12 17:00:00 cc 4 1.5 2022-11-15 10:00:00 dd 

Если выводить каждое значение столбца через print в отдельной строке, тогда код работает.

CLOSE (Transact-SQL)

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

Синтаксис

CLOSE < < [ GLOBAL ] cursor_name >| cursor_variable_name > 

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

GLOBAL
Указывает, что аргумент cursor_name ссылается на глобальный курсор.

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

cursor_variable_name
Имя переменной курсора, связанной с открытым курсором.

Примеры

В следующем примере показано правильное размещение инструкции CLOSE в процессе на основе курсора.

DECLARE Employee_Cursor CURSOR FOR SELECT EmployeeID, Title FROM AdventureWorks2022.HumanResources.Employee; OPEN Employee_Cursor; FETCH NEXT FROM Employee_Cursor; WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM Employee_Cursor; END; CLOSE Employee_Cursor; DEALLOCATE Employee_Cursor; GO 

См. также

  • Курсоры
  • Курсоры (Transact-SQL)
  • DEALLOCATE (Transact-SQL)
  • FETCH (Transact-SQL)
  • OPEN (Transact-SQL)

Обратная связь

Были ли сведения на этой странице полезными?

Курсор Oracle PL/SQL: неявный, явный, цикл For с примером

Курсор является указателем на эту контекстную область. Oracle создает контекстную область для обработки оператора SQL, которая содержит всю информацию об этом операторе.

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

Курсор бывает двух типов.

  • Неявный курсор
  • Явный курсор

Неявный курсор

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

Явный курсор

Программистам разрешено создавать именованную контекстную область для выполнения своих операций DML, чтобы получить больший контроль над ней. Явный курсор должен быть определен в разделе объявлений файла Блок PL / SQLи он создается для оператора SELECT, который необходимо использовать в коде.

Ниже приведены шаги по работе с явными курсорами.

  • Объявление курсора Объявление курсора просто означает создание одной именованной области контекста для оператора SELECT, которая определена в части объявления. Имя этой контекстной области совпадает с именем курсора.
  • Открывающий курсорОткрытие курсора даст указание PL/SQL чтобы выделить память для этого курсора. Это подготовит курсор к выборке записей.
  • Получение данных из курсораВ этом процессе выполняется оператор SELECT, и выбранные строки сохраняются в выделенной памяти. Теперь они называются активными наборами. Извлечение данных из курсора — это действие на уровне записи, что означает, что мы можем получить доступ к данным по записи. Каждый оператор выборки извлекает один активный набор и содержит информацию об этой конкретной записи. Этот оператор аналогичен оператору «SELECT», который извлекает запись и присваивает ее переменной в предложении «INTO», но он не генерирует никаких исключений.
  • Закрытие курсораКак только вся запись будет получена, нам нужно закрыть курсор, чтобы освободить память, выделенную для этой контекстной области.

Синтаксис

DECLARE CURSOR IS  BEGIN OPEN ; FETCH INTO ; . . CLOSE ; END;
  • В приведенном выше синтаксисе часть объявления содержит объявление курсора и переменную курсора, в которой будут назначены извлеченные данные.
  • Курсор создается для оператора SELECT, указанного в объявлении курсора.
  • На этапе выполнения объявленный курсор открывается, извлекается и закрывается.

Атрибуты курсора

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

Атрибут курсора Описание
%НАЙДЕННЫЙ Он возвращает логический результат «ИСТИНА», если последняя операция выборки успешно извлекла запись, в противном случае он вернет ЛОЖЬ.
%НЕ НАЙДЕНО Это работает противоположно %FOUND: он вернет «ИСТИНА», если последняя операция выборки не смогла получить какую-либо запись.
%ОТКРЫТ Он возвращает логический результат «ИСТИНА», если данный курсор уже открыт, в противном случае он возвращает «ЛОЖЬ».
% ROWCOUNT Он возвращает числовое значение. Он дает фактическое количество записей, на которые повлияла активность DML.

Пример явного курсора:

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

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

Курсор Oracle PL/SQL

DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name); END LOOP; Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT); CLOSE guru99_det; END: /

Результат

Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3

Код Пояснение

  • Строка кода 2: объявление курсора guru99_det для оператора «SELECT emp_name FROM emp».
  • Строка кода 3: объявление переменной lv_emp_name.
  • Строка кода 5: Открытие курсора guru99_det.
  • Строка кода 6: Настройка оператора базового цикла для извлечения всех записей в таблице emp.
  • Строка кода 7: Извлекает данные guru99_det и присваивает значение lv_emp_name.
  • Строка кода 9: Использование атрибута курсора «%NOTFOUND», чтобы определить, выбрана ли вся запись в курсоре. Если оно получено, оно вернет «ИСТИНА», и элемент управления выйдет из цикла, в противном случае элемент управления продолжит извлекать данные из курсора и печатать данные.
  • Строка кода 11: Условие EXIT для оператора цикла.
  • Строка кода 12: Распечатайте полученное имя сотрудника.
  • Строка кода 14: Использование атрибута курсора «%ROWCOUNT» для определения общего количества записей, которые были затронуты/выбраны в курсоре.
  • Строка кода 15: После выхода из цикла курсор закрывается и выделенная память освобождается.

Оператор циклического курсора FOR

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

Синтаксис

DECLARE CURSOR IS ; BEGIN FOR I IN LOOP . . END LOOP; END;
  • В приведенном выше синтаксисе часть объявления содержит объявление курсора.
  • Курсор создается для оператора SELECT, указанного в объявлении курсора.
  • На этапе выполнения объявленный курсор устанавливается в цикле FOR, и в этом случае переменная цикла «I» будет вести себя как переменная курсора.

Курсор Oracle для примера цикла:
В этом примере мы проецируем все имена сотрудников из таблицы emp, используя цикл курсора-FOR.

DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name); END LOOP; END; /

Результат

Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY

Код Пояснение

  • Строка кода 2: объявление курсора guru99_det для оператора «SELECT emp_name FROM emp».
  • Строка кода 4: Создание цикла FOR для курсора с переменной цикла lv_emp_name.
  • Строка кода 5: Печать имени сотрудника на каждой итерации цикла.
  • Строка кода 8: Выйти из цикла

Примечание: В цикле Cursor-FOR атрибуты курсора использовать нельзя, поскольку открытие, выборка и закрытие курсора выполняются неявно с помощью Цикл FOR.

  • Учебное пособие по Oracle PL/SQL по динамическому SQL: немедленное выполнение и DBMS_SQL
  • Oracle PL/SQL BULK COLLECT: пример FORALL
  • Автономная транзакция в Oracle PL/SQL: фиксация, откат
  • 65 вопросов и ответов на собеседовании по PL/SQL (2023 г.)
  • Учебное пособие по Oracle Pl/SQL в формате PDF для начинающих (загрузить сейчас)

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

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