Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
RBD_END.DOC
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
548 Кб
Скачать
☆

Синтаксис объявления типов

CREATE [OR REPLACE] TYPE type_name

[AUTHID {CURRENT USER | DEFINER}]

{IS | AS object (

[{MAP | ORDER} member function_spec, ]

[{MEMBER | STATIC} {subrout_pr_spec | call_spec}]

[, { //--// }] …

);

Фрагмент [AUTHID {CURRENT USER | DEFINER}] определяет, с какими правами будут выполняться методы в определенном нами объекте. Если выбрали DEFINER, то методы, определенные в объекте, будут выполняться с правами автора объекта.

В объявлении объекта сами тела функций отсутствуют.

[ CREATE [OR REPLACE] TYPE BODY {IS | AS}

{ {MAP | ORDER} member function_body,

|{MEMBER | STATIC} {subpr_body | call_spec}; }

[{MEMBER | STATIC} {subpr_body | call_spec}; }] …

END; ]

Пример объекта типа STACK.

Определим спецификацию типа:

CREATE TYPE IntArray AS VARRAY(25) OF Integer;

CREATE TYPE Stack AS object(

max_size Integer,

top Integer, - указатель на вершину стека

position IntAttay, - сам стек

MEMBER PROCEDURE initialize,

MEMBER FUNCTION full RETURN BOOLEAN,

MEMBER FUNCTION empty RETURN BOOLEAN,

MEMBER PROCEDURE push (n IN integer), - входной параметр

MEMBER PROCEDURE pop (n OUT integer) - выходной параметр

);

/

Определим тело объекта:

CREATE TYPE BODY stack AS

MEMBER PROCEDURE initialize IS

BEGIN

top:=0; - можно было написать Self.top

position:=IntArray(NULL);

max_size:=position.LIMIT; - определили содержимое поля max_size,

используя метод LIMIT

position.EXTEND (max_size-1,1); - заполняем элементы со 2-го по 25-й значением

первого элемента

END initialize;

MEMBER FUNCTION full RETURN boolean IS

BEGIN

RETURN(top=max_size); - если указатель на вершину стека=max_size, то

стек полностью заполнен

END full;

MEMBER FUNCTION empty RETURN boolean IS

BEGIN

RETURN(top=0); - если указатель на вершину стека=0, то

стек пустой

END empty;

MEMBER PROCEDURE push (n IN integer) IS

BEGIN

IF NOT full THEN

top:=top+1;

position(top):=n;

ELSE

RAISE_APPLICATION_ERROR(-20102,'stack overflow');

END IF;

END push;

MEMBER PROCEDURE pop (n OUT integer) IS

BEGIN

IF NOT empty THEN

n:=position(top);

top:=top-1;

ELSE

RAISE_APPLICATION_ERROR(-20102,'stack underflow');

END IF;

END pop;

END; - закрыли оператор CREATE

/

Объявление и инициализация объектов

Пример

DECLARE

S:stack; - объявление объект

Begin

S:=stack(10,1); - инициализация объекта

End;

Конструкторы в PL/SQL всегда нужно вызывать явно. Если конструктор объекта не вызывался, то тогда необходимо помнить о том, что атрибуты имеют значение null. Более того, сам объект имеет значение null. Если попытаться присвоить значения полям без вызова объекта, то будет вызвана исключительная ситуация.

Объекты можно:

  • хранить в БД;

  • допускаются операции SELECT, INSERT, UPDATE.

Пример:

CREATE TABLE nr (rn Rational, …);

INSERT INTO nr (rn) VALUES (Rational(3,62));

Вызов методов

Пример:

S.initialize; - инициализация стека

IF not s.full THEN …

S.push(r); - заполнение стека

При определении объектов можно использовать уже существующие объекты в качестве атрибутов объектов. Для этого используют специальные ключевые слова REF (указатель на объект) и DEREF (чтобы получить сам объект, а не указатель).

При определении объектов допускается использование предварительного определения объектов. Для этого используется конструкция CREATE TYPE имя_типа_объекта.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]