Использование курсоров
Использование курсоров
Курсоры открываются с помощью оператора OPEN CURSOR, синтаксис которого настолько прост, что его поддерживают большинство СУБД: OPEN CURSOR CustCursor
При обработке оператора OPEN CURSOR выполняется запрос, и выборка данных сохраняется для последующих просмотра и прокрутки.
Теперь доступ к данным этого курсора может быть получен с помощью оператора FETCH. Оператор FETCH указывает строки, которые должны быть выбраны, откуда они должны быть выбраны и где их следует сохранить (имя переменной, например). В первом примере используется синтаксис Oracle для выборки одной строки курсора (первой).
OPEN CustCursor; FETCH CustCursor INTO CustRecord;
CLOSE CustCursor; END;
В данном примере оператор FETCH используется для выборки текущей строки (автоматически он начнет с первой строки) в переменную, объявленную с именем CustRecord. С выбранными данными ничего не делается.
В следующем примере (в нем вновь используется синтаксис Oracle) выбранные данные подвергаются циклической обработке от первой строки до последней:
OPEN CustCursor;
LOOP
FETCH CustCursor INTO CustRecord;
EXIT WHEN CustCursor%NOTFOUND;
END LOOP; CLOSE CustCursor; END;
Аналогично предыдущему примеру, здесь используется оператор FETCH для выборки текущей строки в переменную, объявленную с именем CustRecord. Однако в отличие от предыдущего примера, здесь оператор FETCH находится внутри цикла LOOP, так что он выполняется снова и снова. Код EXIT WHEN CustCursor%NOTFOUND указывает, что этот процесс должен быть завершен (выход из цикла), когда больше не останется строк для выборки. В этом примере также не выполняется никакой обработки, тогда как в реальном коде вам следовало бы заменить . . . вашим собственным кодом.
Вот другой пример, на этот раз с использованием синтаксиса Microsoft SQL Server:
@cust_name CHAR(50),
@cust_address CHAR(50),
@cust_city CHAR(50),
@cust_state CHAR(5),
@cust_ZIP CHAR(IO),
Ocus t_count ry CHAR (50),
ecust_contact CHAR(50),
@cust_email CHAR(255), OPEN CustCursor FETCH NEXT FROM CustCursor
INTO @cust_id, @cust_name, @cust_address,
@cust_city, ®cust_state, @cust_ZIP,
@cust_country, @cust_contact, @cust_email WHILE @@FETCH_STATUS = 0 BEGIN
FETCH NEXT FROM CustCursor INTO @cust_id, @cust_name, @cust_address, @cust_city, @cust_state, @cust_ZIP, @cust_country, @cust_contact, @cust_email
END;
CLOSE CustCursor;
В этом примере переменные объявляются для каждого из выбираемых столбцов, а операторы FETCH осуществляют выборку строки и сохранение значений в этих переменных. Цикл WHILE используется для организации цикла по строкам, а условие WHILE @@FETCH_STATUS = 0 обеспечивает завершение обработки (выход из цикла) после того как все строки будут извлечены. И вновь этот пример ничего на самом деле не обрабатывает. В реальном коде нужно заменить . . . вашим собственным кодом.



