Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв БД 2013-03-15.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
12.65 Mб
Скачать

5.4.4.2. Объектные переменные

Объектные переменные содержат описания сложных объектов (структур данных), их атрибутов и методов. Перед объявлением объектной переменной необходимо создать объектный тип:

Create type <имя типа> {is | as} object (<имя атрибута> <тип атрибута>, ...)

Для инициализации объекта нужно вызвать его конструктор (имя его совпадает с именем объекта) со списком фактических параметров.

5.4.4.3. Записи

Записью называется группа зависимых элементов (полей).

Запись объявляется в виде:

Type <тип> is record (<имя поля> <тип поля> [[not] null][:=<значение>], ...)

Примеры объявления переменных.

/* Subtype Fam is Varchar2(30); --неверное объявление подтипа Fam*/

temp Varchar2(30); Subtype Fam is temp%type --верное объявление подтипа Fam

Type TimeRec is Record (min Integer, hours Integer); --объявление типа-записи

Subtype Time is TimeRec; --основан на типе Record TimeRec

Subtype Fam is sotrudniki.fam%type -основан на типе столбца sotrudniki.fam

Cursor sotr is select * from Sotrudniki --объявление курсора sotr (п. 5.4.7)

Subtype T_Sotr_zap is sotr%rowtype --основан на типе строки курсора sotr

Допускается вложенность записей. Обращение к полю имеет вид: <имя переменной‑записи>.<имя поля>.

Переменным-записям можно присваивать значения:

  1. применением оператора присваивания для переменной-записи с той же структурой (названиями и типами полей);

  2. выполнением операторов Select или Fetch.

Пример вложенной записи

Declare

type timetyp is record (minute smallint, hour smallint);

type meetingtyp is record -- вложенная запись

(day date, time timetyp, place char(20), purpose char(50));

type partytyp is record (day date, time timetyp, loc char(15));

meeting meetingtyp; seminar meetingtyp; party partytyp;

begin meeting.day := '26-jun-91'; meeting.time.minute := 45;

meeting.time.hour := 10;

end;

Пример формирования временной таблицы (Temp) с фамилиями и окладами высокооплачиваемых инженеров (код должности равен 3).

Declare

Dolgnost_zap Dolgnosti%Rowtype; --запись для строки таблицы Dolgnosti

Cursor sotr is select fam from Sotrudniki where kd=3 --объявление курсора sotr

Sotr_zap sotr%rowtype --запись для строки курсора sotr

Begin

Select * into Dolgnost_zap from Dolgnosti where Dolgnosti.kd=3; --чтение строки

Open sotr; --открытие курсора

Loop --цикл чтения курсора (п. 5.4.7)

Fetch sotr into Sotr_zap; --чтение строки курсора в запись Sotr_zap (п. 5.4.7)

Exit when sotr%notfound; --выход из цикла, если строки курсора закончились

If Sotr_zap.oklad>20000 then --условие проверки оклада

insert into temp Values (Sotr_zap.fam, Dolgnost_zap.nd, Sotr_zap.oklad);--вывод

End if;

End loop;

Close sotr; -закрытие курсора sotr

End;

5.4.4.4. Коллекции

Коллекция представляет собой упорядоченную группу элементов одного типа. Доступ к элементу осуществляется в виде:

<имя переменой типа коллекции>(<индекс>).

Коллекции бывают типов: вложенные таблицы и varray‑массивы.

Вложенная таблица - это переменная типа Tаble. Ee можно рас­смат­ривать как одномерный массив, элементы которого индексируются пере­мен­ной типа Binary Integer со значениями в пределах от -2147483647 до 2147483647, и память элементу отводится только после присвоения эле­мен­ту значения, т.е. не имеют пустоты внутри, которые появляются после уда­ле­ния элементов.

Varray‑массив является обычным массивом.

Объявление коллекций имеет вид:

Type <имя таблицы> is table of <тип элемента> [not null];--обычная таблица

Type <имя таблицы> is table of <тип элемента> [not null]--индексированная

Index by binary_integer; --таблица

Type <имя таблицы> is varray (<число элементов>)

of <тип элемента>[not null]; --массив

Пример объявления и использования массива типа Table.

Declare

Type mfam_type is Table Of Varchar(40) Index By Binary_Integer;

mfam mfam_type; i Binary_Integer:=1;

begin

mfam(0):=’Иванов’; mfam(i):=’Сидоров’; mfam(2):=’Петров’;

Пример создания объектов (п. 5.4.2.2).

Create type tdeti as table of varchar2(10); --вложенная таблица с именами детей

Create type sotrudnik as object (tn integer(4), fam varchar2, deti tdeti);

Массив переменных может храниться в базе в виде столбца. Доступ к такому элементу осуществляется оператором Table().

Для инициализации коллекции используется конструктор вида:

<имя типа коллекции>(<значение>, ...)

Пример создания объектов и таблицы поставок товаров со столбцом post_tovari, который является varray‑массивом.

Create type tovar as object (kt number(3), nt varchar2(30), cena number(10,2));

Create type mtovar as varray(100) of tovar;

Create table tabtavari (kp number(3), post_tovari mtovar);

Insert into tabtavari values(1, ‘Уралмаш’, --ввод значений в таблицу

mtovar(tovar(1,’Буровая,1000000’),tovar(2,’Экскаватор’,2000000 )));

Таблицы имеют методы:

Exists(n) - наличие/отсутствие (True/False) эле­мента под номером n.

Count ‑ число элементов (hfam=fams.count).

Limit ‑ максимально допустимое число элементов в varray‑массиве.

First/Last ‑ номер первого/последнего элемента.

Prior(n)/Next(n) ‑ номер преды­ду­щего/следующего элемента после про­пус­ка n элементов.

Extend([k[,n]]) ‑ добавляется k (один элемент, если k отсутствует) копий элемента (или Null, если n не указан) под номером n.

Trim([n]) ‑ удаление последних n (1) элементов.

Delete([n[,k]]) ‑ удаление группы элементов под номерами от n до k (n) или всех элементов, если n и k не указаны соответственно.

Пример

Declare

stovar mtovar --объявление таблицы типа mtovar из предыдущего примера

Begin

select post_tovari into stovar from Tabtavari Where kp=1

For i in stovar.first.. stovar.lasr loop

post_tovari.cena<1000000 then stovar.delete(i); endif

end loop;

update Tabtavari set post_tovari=stovar Where kp=1;

end;