Курсоры

В ответ на запросы пользователя 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



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: