Этот курсор DB2 представляет собой цикл?

По судьбе или удаче, Я работаю над преобразованием хранимых процедур DB2 в хранимые процедуры SQL Server.

Одна вещь, которую я не мог полностью понять в DB2, - это cursors1. Глядя на него и читая некоторую документацию, кажется, что это всего лишь оператор выбора.

-- DB2 stored procedure code
declare entity_cursor cursor with return for
select *
from TableName;

...
--a lot more cursors like above, and some other code
...

open entity_cursor;

Вопросов

  1. Правильно ли я в своем предположении 2, что это только оператор selectна самом деле, возвращающий набор результатов при открытии курсора?
  2. Если произошла ошибка до, курсор открыт 3, вернет ли SP пустой набор результатов для entity_cursor?

1: Я знаю, что в SQL Server они обычно используются для выполнения операций построчно. 2: Основано на чтении документации по DB2 и немного на моих знаниях и интеллекте. 3: К сожалению, я не могу полностью протестировать хранимую процедуру в DB2.

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

Wes Palmer 19.10.2018 18:14

Сам по себе курсор не является циклом. Это указатель на строку / набор строк (поскольку RBAR обычно плохой, большинство курсоров определены для возврата блока записей за раз). Простое открытие курсора не дает вам никаких строк - вам нужно перейти от него к FETCH, чтобы получить данные. Чтобы сделать это циклом, вам нужно будет выполнять FETCH NEXT..., пока курсор не сообщит «больше нет строк / наборов строк, сопряжение». Нет никакой разницы в функции SQL Server (кроме SQL Server, похоже, не разрешены блоки строк).

Clockwork-Muse 19.10.2018 21:58

@WesPalmer в DB2 курсор используется для явного определения набора результатов, возвращаемого клиенту. MS SQL делает это неявно, используя только SELECT в теле SP.

Charles 22.10.2018 20:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
692
1

Ответы 1

К вашему первому вопросу: как упоминалось в комментариях, открытие курсора не создает набор результатов, а просто (указатель на) структуру, позволяющую вам получить доступ к набору результатов с помощью оператора FETCH или его эквивалента. Более того, набор результатов может даже не быть полностью материализован, когда вы начинаете выборку записей - это зависит от фактического запроса и различных параметров курсора.

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

Другие вопросы по теме