Шаг 51 - PL/SQL - КУРСОР, теория

Основной базис PL/SQL, как вы уже наверное заметили, мы с вами, можно сказать, получили. Пришло время начинать разбираться с краеугольным, так сказать, камнем языка PL/SQL - а, именно с таким понятием как "КУРСОР". Но, для начала давайте, рассмотрим несколько понятий, которые предваряют этот материал. Ранее я часто упоминал, такое слово как "транзакция". Мы еще не раз к ней будем возвращаться, так как это довольно объемная тема. Но, чтобы было проще для понимания, начнем вот с чего. Допустим, многие из Вас ходили в Сбербанк платить за квартиру, за талоны техосмотра, ну и еще много чего. По своей сути вы выполняли банковскую операцию платежа. В принципе это и есть не что иное, как транзакция (банковская в данном случае). Вы отдаете квитанцию девушке операционистке, то есть вы инициируете начало транзакции, девушка проделывает пляшущее движение пальчиками по клавиатуре то есть вводит в машину ваш код платежа, сумму и т.д. тем самым выполняет операцию отъема у вас энной суммы денег! :) Затем, мило улыбаясь, говорит сколько вы должны выложить денежек и так же мило улыбаясь, берет их у вас и отсчитывает сдачу, если таковая должна иметь место. То есть происходит процесс обмена, данными (в нашем случае квитанция - деньги). Затем она быстренько разбрасывает отполовиненные квитанции по ячейкам, а вторые половинки отдает вам. Все, транзакция завершена, оплата прошла. Примерно тоже самое происходит внутри сервера Oracle когда вы подключаетесь к нему скажем при помощи SQL*Plus. К чему я все это тут вам рассказываю, а к тому что - понятие механизма обмена данными между клиентом и сервером БД, достаточно хорошо просматривается на примере работы курсоров. По мере их изучения, мы понемногу подберемся к теме, определения экземпляров БД и еще многим, достаточно сложным понятиям. Пока это описание банковского платежа, пусть отложится у вас в памяти, оно еще нам потребуется! :) Проводя аналогии с реальными ситуациями, иногда достаточно просто разобраться со сложными процессами, которые происходят внутри БД, что я вам еще не раз продемонстрирую. Итак, в прошлый раз мы изучили оператор %TYPE. Надеюсь, вы поняли, что это за оператор и что он позволяет выполнять. Так же в PL/SQL для удобства работы с данными имеется еще один очень полезный и наиболее часто применимый оператор %ROWTYPE! Он способен проделывать, очень интересный фокус. Посмотрим, как он работает:

---------- переменная - структура данных%ROWTYPE --------------

Запишем такой пример:

DECLARE

	v_RecOffices OFFICES%ROWTYPE;
	
	.
	.
	.

При этом переменная v_RecOffices будет иметь вот такую внутреннюю структуру:

v_RecOffices(
	OFFICE INTEGER 
	CITY VARCHAR2(30),
	REGION VARCHAR2(30),
	MGR INTEGER,
	TARGET NUMBER,
	SALES NUMBER
)

Так как мы объявили переменную v_RecOffices на базе таблицы OFFICES, то в результате получаем "запись" с внутренней структурой идентичной полям таблицы OFFICES. То есть в своей сути v_RecOffices это не просто переменная, а переменная типа "запись" и она содержит в нашем случае как бы шесть переменных, типы которых, совпадают с типами полей таблицы OFFICES! Теперь надеюсь ясно, что за один раз в такую, переменную, можно будет поместить целую строку из таблицы OFFICES и, если какое либо поле в таблице будет изменено в процессе сопровождения кода, то менять что-то в коде нет необходимости, так как тип %ROWTYPE, будет сам реагировать на эти изменения. Так же есть возможность обращаться к любому полю записи v_RecOffices. Такое обращение производиться через точечную нотацию (как в языке Pascal):

DECLARE
	 
	a INTEGER := v_RecOffices.OFFICE;
	b VARCHAR2(50) := v_RecOffices.CITY;
	c INTEGER := v_RecOffices.MGR;

То есть, после выборки строки из таблицы очень легко получить отдельные значения полей в промежуточные переменные. За один раз можно выбрать только одну строку в переменную данного типа! Так же как и для %TYPE ограничение NOT NULL для полей записи отсутствует. В дальнейшем вы увидите как %ROWTYPE значительно облегчает последовательную выборку данных при работе с курсорами.


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