По судьбе или удаче, Я работаю над преобразованием хранимых процедур 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;
Вопросов
selectна самом деле, возвращающий набор результатов при открытии курсора?entity_cursor?1: Я знаю, что в SQL Server они обычно используются для выполнения операций построчно. 2: Основано на чтении документации по DB2 и немного на моих знаниях и интеллекте. 3: К сожалению, я не могу полностью протестировать хранимую процедуру в DB2.
Сам по себе курсор не является циклом. Это указатель на строку / набор строк (поскольку RBAR обычно плохой, большинство курсоров определены для возврата блока записей за раз). Простое открытие курсора не дает вам никаких строк - вам нужно перейти от него к FETCH, чтобы получить данные. Чтобы сделать это циклом, вам нужно будет выполнять FETCH NEXT..., пока курсор не сообщит «больше нет строк / наборов строк, сопряжение». Нет никакой разницы в функции SQL Server (кроме SQL Server, похоже, не разрешены блоки строк).
@WesPalmer в DB2 курсор используется для явного определения набора результатов, возвращаемого клиенту. MS SQL делает это неявно, используя только SELECT в теле SP.





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