В ответ на запросы пользователя SQL может возвращать многие сотни тысяч сторон, общим объемом в 10 Мбайт. В системе не каждый может иметь достаточный объем памяти и обработать их.
Кроме того, обычно клиент работает с небольшой частью данных в определенный момент времени, например с одной строкой, а не со всем набором строк.
Т.е. клиенту не нужен одновременно весь набор данных, и для него предпочтительно получать данные порциями.
Механизмом, обеспечивающим хранение результата выборки и представляют пользователю возможность доступа к любой строке выборки по ее номеру, являются курсоры.
Пользователь может работать в каждый момент времени только с одной строкой и курсор является своего рода окном, накладываемым на результат выборки. Перемещая окно, пользователь может не иметь доступ к любой строке выборки.
Для обработки SQL оператора Oracle выделяет атлас памяти, называемый контекстной областью. Она содержит информацию, необходимую для завершения обработки:
1. число строк, обработанных оператором
2. указатель на представление этого оператора
3. активный набор (набор строк, возвращение запросом).
Курсор - это указатель на контекстную область, с помощью которого PL SQL может управляться контекстной областью и ее состоянием во время обработки оператора.
Курсор - разновидность файла, которая создается во время.
Это средство погруженного SQL хранения результатов для дальнейшей обработки.
Для использования курсоров надо:
1. объявить курсор
2. открыть курсор для запроса
3. выбрать результаты в переменные PL SQL
4. закрыть курсор
1.Объявление курсора.
При объявлении курсора ему назначается имя и ставится в соответствие некоторой Select.
Cursor имя курсора IS оператор Select
Курсор должен быть объявлен (описан) до того, как на него будет произведена ссылка в нем, можно использовать любые оператор Select, в том числе соединение (joins), объединение (union), вычитание (minus).
Все переменные, которые используются в курсоре, должны быть ему видимы, т.е. они должны быть объявлены до их использования в курсоре.
Declare
V - probeg cena √ avto. probeg % type;
V - cena cena √ avto. Ceno % type;
Объявление курсора: cursor c √ cena is
Select from cena √ avto where cena = v √ cena;
Begin
V √ cena: = 2000;
Open c √ cena;
End.
2. Открытие курсора.
Open - имя курсора.
Позволяет СУБД обработать запрос курсора и записать результат в ╚курсор╩.
При открытии курсора происходит:
1. анализируется значения переменных привязки
2. на основе значений переменных привязывается определенный активный набор (т.е. набор строк, возвращаемый запросом)
3. указатель активный: наборы устанавливаются на одну строку.
Чтобы переменным привязки присвоить новые значения и курсор, работая с ними надо курсор закрыть, присвоить переменной привязки новые значения и снова открыть курсор.
3. Выбрать данные для обработки (считывание строк из курсора).
FETCH - имя курсора INTO √ список переменных
FETCH имя курсора INTO запись PL/SQL
С помощью оператора FETCH считывается 1 строка из курсора. Тип переменной курсора должен соответствовать переменной выбора запроса.
В случае если считывание идет в запись PL/SQL, то переменная типа запись объявляется
V √ cur cena √ avto % ROWTYPE
4. Закрытие курсора.
Close имя курсора. Закрытие курсора производят после того как выбран весь активный набор. При этом все отведенные ресурсы для курсора освобождают (пространство для хранения активного набора и временное пространство, используемое для определения такого набора).
Курсорные атрибуты.
Добавляются к имени курсора в блоке PL/SQL подобно атрибутам % type и % nowtype.
1. % found √ возвращает значение TRUE если строка была выбрана RALSE если не выбрана строка.
2. % notfound √ противоположно % found
3. % open используется для определения открыт или нет соответствующий курсор. Если открыт - TRUE, иначе √ FALSE.
4. % ROWCOUNT √ возвращает число строк, считанных курсором.
Циклы выборки.
Чаще всего курсоры используются для считывания всех строк активного набора с помощью циклов.
Примеры:
Для работы с курсором, триггером, процедурами необходимо установить привилегии.
Установка привилегий:
1. войти в ORACLE под именем SUSTEM пароль MANAGER
2. ввести следующую запись:
SQL grant all privileges to scott
3. зайти в SQL под именем scott
Пример:
Declare
V √ name cena_avto name % TYPE
V √ cena cena_avto cena % type
V √ probeg cena_avto probeg % type
V √ aod cena_avto god % type
/ *объявляем курсор*/
cursor curmy is
select name, probeg, cena, god from cena_avto
Where god between 1991 and 12000
Begin
Open curmy
Loop
/ *считываем информацию о машине* /
fetch aurmy into v_name v_cena v_probeg v_god;
(выйдем из цикла, когда строк для выбора больше нет)
exit when cuemy % NOFFOUND
(обработали считанные строки)
insert into table (name, probeg, cena, god)
values (v_name, v_probeg, v_ceno, v-god)
End loop;
(освободить ресурсы, используемые курсор)
close curmy
(завершим работу)
commit
End.
Пример больница:
Пациент, его атрибуты
Врачи, карточка
Create table Pazient
(FIO varchar 2 (30)
Vozrast char (20)
N polis char (20)
Address varchar 2 (30)
N kart char (20) not null
N uch char (20 not null)
Primary ney (N kart N uch))
Create table Vrach
(FIO vrach varchar 2 (30)
spezialnost char (30)
N vracha char (20) not null
Primary ney (N vrach))
Create table kartochka
(data char (20)
shialoba varchar 2 (2000)
diagnoz varchar 2 (2000)
lechenie varchar 2 (2000)
povt priem char (20)
N ZAP char (20) not null
N kart char (20)
N uch char (20)
Primary key (N ZAP)
Foreing key (N kart N uch)
Pacient (N kart N uch))
Create table uslugi
Name varchar 2 (500) not null
Cena char (10)
N vracha char (20)
N ZAP char (20)
Brimary rey (name)
Forein key (N ZAP)
Create table vizov vracha
N vrach char (20)
N ZAP char (20)
Foreing key (N vrach)
Расписание и начисление заработной платы.
Crate procedure
V_vrach (nvr in char npo in char) is begin
Declare
Cursor cur2 is select vrach. Kartochka n ZAP from vrach pacient kartochka where nach fio vrach = nvr and pacient n polis = npo and kartochka nuch = pacient nuch
(объявляем курсорную переменную)
cur2 VIZOV VRACH % type
begin
open cur2
fetch cur2 into
cur2
insert into VIZOV VRACH
values (cur2-r n vrach cur2_r nZAP)
close cur2
end
end
/
execute v_vrach (IVANOV)
selest * from VIZOV_ VRACHA