Шаг 52 - PL/SQL - КУРСОР, теория - продолжаем

В прошлый раз, я заморочил вам голову с аналогиями! Но надеюсь, что понятие транзакция для вас не пустой звук! :) Что ж, давайте определим, что же такое "курсор". Если говорить по большому счету понятие курсор в серверах SQL является фундаментальным и вот почему. Все базовые операторы DML - это не что иное, как - да! да! "курсоры". При выполнении INSERT, UPDATE и т.д. в "глобальной системной области", (применительно к Oracle) - всегда, открывается "курсор"! Курсоры имеют ряд атрибутов для облегчения работы с ними. Так же курсоры могут быть явными и не явными. Кстати все операторы DML (благо их не так много) - это не что иное, как неявные курсоры. Так же курсоры могут быть параметризованные или нет. Что ж, много всего навалилось, давайте разбирать это все последовательно. Итак, немного анатомии курсора сервера Oracle. При обработке SQL - операторов Oracle выделяет область памяти называемую "контекстной областью" (context area). Она содержит информацию необходимую для начала и завершения обработки SQL оператора. В том, числе - число строк обрабатываемых оператором, указатель на представление этого оператора после синтаксического анализа (еще это называют парсинг) и активный набор (active set) - например набор строк возвращаемых запросом.

Итак: КУРСОР - это указатель (хотя как такового, понятия "указатель" в PL/SQL нет!) на контекстную область памяти, с помощью которого программа на языке PL/SQL может управлять контекстной областью и ее состоянием во время обработки оператора.

Объявление курсора определяет какое выражение языка SQL - будет передано программе SQL Statement Executor (системе исполнителю выражения SQL). Курсор может представлять собой любое допустимое предложение языка SQL! Так же, курсор является основным базовым "кирпичиком" для построения блоков PL/SQL. Курсоры обеспечивают циклический механизм оперирования наборами данных в БД. Курсор может возвращать одну или несколько строк данных или вообще ни одной.

Типичная последовательность, при операциях в данном случае с явными (определенными курсорами) будет такая:

  1. Объявление курсора и структуры данных, в которую, будут помещены найденные строки.
  2. Открытие курсора.
  3. Последовательная выборка данных.
  4. Закрытие курсора.

Полный синтаксис определения явного курсора таков:

------ CURSOR -- имя (передаваемые параметры) --- IS -----
---------------- SELECT список полей FROM таблица выбора
---------------- WHERE условия выбора в курсор -----------

Вот так определяется явный курсор. Давайте запишем несколько определений курсоров, и вы посмотрите как это делается. Если пока что-то не понятно можете не расстраиваться, я все поясню по ходу.

Итак:

DECLARE
	
	-- 1.
	-- Выбрать все заказы:
	CURSOR get_orders IS
		SELECT * FROM ORDERS;
	
	-- 2.
	-- Выбрать несколько столбцов
	-- для определенного номера заказа
	CURSOR get_orders(Pord_num ORDERS.order_num%TYPE) IS
		SELECT ORDER_DATE, MFR, AMOUNT FROM ORDERS
		WHERE order_num = Pord_num;
		   
	-- 3.
	-- Получить полную запись
	-- для определенного номера заказа
	CURSOR get_orders(Pord_num ORDERS.order_num%TYPE) IS
		SELECT * FROM ORDERS
		WHERE order_num = Pord_num
		RETURN ORDERS%ROWTYPE;
	
	-- 4.
	-- Получение имени сотрудника
	-- по его номеру
	CURSOR get_name(empl_nm SALESREPS.empl_num%TYPE) 
		RETURN SALESREPS.name%TYPE IS
		SELECT name FROM SALESREPS WHERE empl_num = empl_nm;

Надеюсь, вы заметили, что курсоры не просто так определены, а выполняют отбор вполне осмысленной информации. Вспомните наши мучения с SELECT, я не даром там распинался. Но те кто его хорошо знают, то же пусть освежат знания. Итак в определенных (явных) курсорах ключевым звеном является оператор SELECT (ДА ОН ВООБЩЕ КЛЮЧЕВОЙ ЗВЕНО ВСЕХ БД!!!). Именно он определяет, что будет возвращать курсор после того как вы его откроете. Итак курсор под номером 1. Это простой не параметризованный курсор возвращающий все содержимое таблицы запроса в данном случае ORDERS. Это самый легкий из курсоров! :) Курсор под номером 2. Это более сложный параметризованный курсор с одним параметром, но их может быть и больше. Он возвращает как видно из условия WHERE одну строку, так как поле order_num ключевое! Обратите внимание при передаче параметра использована конструкция %TYPE. Курсор под номером 3. Чуть более расширенная версия предыдущего, кроме того используется конструкция RETURN - с применением переменной записи на базе таблицы ORDERS. Такая конструкция просто возвратит одну полную запись из таблицы ORDERS при открытии курсора. Такие конструкции курсоров мы рассмотрим после того, как разберемся с процедурами и функциями. Курсор 4. Это то же самое, что и курсор 3, но он применяет конструкцию RETURN для того, чтобы вернуть значение одного поля таблицы SALESREPS, обратите внимание на местоположение оператора RETURN, хотя я в своей практике такие "фортели" с курсорами не использовал! :) Но, тем не менее, в документации такое есть и вам будет полезно посмотреть как это выглядит! Вот собственно, так (пока отвлеченно) определяются курсоры. Можете пока все это переварить, так как дальше на вас обрушится еще большее количество информации!!! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 02.11.2003