Выбрать главу

id=1, name=John Brown, t i t le = M a n a g e r , company=XYZ Corp

Так как произведён вызов функции display_details (), определённой в t_

business_person3, то возвращаемый функцией VARCHAR2 содержит атрибуты

id, first_name, и last_name, а также атрибуты title и company.

Обобщённый вызов

Как вы видели в предыдущем разделе, вы можете переопределить метод

супертипа методом подтипа. Обобщённый вызов является новой возможностью

базы данных Oracle l lg , который позволяет вам вызвать метод супертипа

из подтипа. Как вы увидите, обобщённый вызов позволяет избежать

повторного создания кода в подтипе, который уже определён в супертипе.

Примечание Автор предоставил сценарий SQL'Plus по имени object_schema3. sql, который

создаёт все элементы, показанные до конца этой главы. Вы можете запустить сценарий object_

schema3.sql только в том случае, если используете базу данных Oracle 11 д. После того, как

сценарий будет выполнен, вы будете загружены под пользователем object_user3.

Следующие выражения создают супертип по имени t _ p e r s o n . Обратите

внимание, что функция d i s p l a y _ d e t a i l s ( ) возвращает VARCHAR2, содержащий

значения атрибутов:

□ CREATE TYPE t_ p e r s o n AS OBJECT (

i d INTEGER,

f i r s t _ n am e VARCHAR2(10) ,

la s t_ n ame VARCHAR2(10) ,

MEMBER FUNCTION d i s p l a y _ d e t a i l s RETURN VARCHAR2

) NOT FINAL;

/

CREATE TYPE BODY t _ p e r s o n AS

MEMBER FUNCTION d i s p l a y _ d e t a i l s RETURN VARCHAR2 IS

BEGIN

RETURN ‘ id = ’ || i d ||

' , name=’ || f i r s t _ n am e || ‘ ‘ I I la s t_ n ame ;

END;

END;

/

Следующий набор выражений создаёт подтип по имени t _ b u s in e s s _

p e r s o n под t_ p e r s o n . Обратите внимание, что функция d i s p l a y _ d e t a i l s ()

переопределена при помощи ключевого слова OVERRIDING:

Объекты базы данных 441

□ CREATE TYPE t _ b u s in e s s _ p e r s o n UNDER t _ p e r s o n (

t i t l e VARCHAR2(20) ,

company VARCHAR2(20),

OVERRIDING MEMBER FUNCTION d i s p l a y _ d e t a i l s RETURN VARCHAR2

);

/

CREATE TYPE BODY t _ b u s in e s s _ p e r s o n AS

OVERRIDING MEMBER FUNCTION d i s p l a y _ d e t a i l s RETURN VARCHAR2 IS

BEGIN

— используем обобщённый вызов для вызова d i s p l a y _ d e t a i l s ( ) из t _ p e r s o n

RETURN (SEL F AS t _ p e r s o n ) . d i s p l a y _ d e t a i l s ||

t i t l e = ' || t i t l e || company=' || company;

END;

END;

/

Как видно, display_details () в t_business_person переопределяет display_

details () в t_ p e r s o n . Следующая строка в display_details () использует обобщённый

вызов для вызова метода супертипа из подтипа:

□ RETURN (S E L F AS t _ p e r s o n ) . d i s p l a y _ d e t a i l s ||

' , t i t l e = ’ || t i t l e || ' , company=’ || company;

Выражение (SELF AS t _ p e r s o n ) . d i s p la y _ d e t a i l s представляет объект текущего

типа (то есть t_business_person) в виде объекта типа t _ p e r s o n с последующим

вызовом d i s p la y _ d e t a i l s () из t_ p e rson. Таким образом, когда происходит

вызов d i s p l a y _ d e t a i l s ( ) в t _ b u s in e s s _ p e r s o n , сначала он вызывает

d i s p l a y _ d e t a i l s ( ) из t_ p e r s o n (который отображает значения атрибутов

id , first_name, и la s t_ n ame ) , а затем отображает значения атрибутов t i t le и

company. Это означает, что не требуется повторно создавать код, который

уже есть в t _ p e r s o n . d i s p la y _ d e t a i l s ( ), в t _ b u s in e s s _ p e r so n . d i s p l a y _ d e t a i l s

( ) . Если у вас есть более сложные методы в ваших типах, эта особенность

может сэкономить большое количество работы и сделать ваш код более

лёгким для поддержки.

Следующие выражения создают таблицу по имени object_biisiness_

customers и добавляют объект в эту таблицу:

□ CREATE TABLE o b j e c t _ b u s in e s s _ c u s t om e r s OF t _ b u s in e s s _ p e r s o n ;

INSERT INTO o b j e c t _ b u s in e s s _ c u s t om e r s VALUES (

t _ b u s in e s s _ p e r s o n ( 1 , ‘ J o h n ’ , ‘ Brown’ , ‘ Man a g e r ’ , ‘ XYZ C o r p ’ )

);

Следующий запрос вызывает display_details () с использованием o b j e c t _

b u s in e s s _ c u s tom e r s :

□ SELECT o.display_details()

FROM object_business_customers o;

0 . DIS P LAY_DETAILS ( )

id=1, name=John Brown, dob=01-FEB-5 5, t i t le = M a n a g e r , company=XYZ Corp

442 Глава 12

Как видно, отображаются id, name и dob (которые выводятся display_

details () из t_person), за которыми следуют title и company (которые выводятся

display_details () из t_business_person).

Итоги

В этой главе вы узнали, что

■ База данных Oracle позволяет создавать объектные типы. Объектный

тип подобен классу в Java, C++, и С#.

■ Объектный тип может содержать атрибуты и методы; объектный

тип создаётся при помощи выражения CREATE TYPE.

■ Вы можете использовать объектный тип для определения объектного

столбца или объектной таблицы.

■ Вы можете использовать объектную ссылку для доступа к индивидуальной

строке в объектной таблице. Объектная ссылка аналогична

указателю в C++.

■ Вы можете создавать и манипулировать объектами в SQL и PL/SQL.

■ Начиная с релиза базы данных Oracle 9i, вы можете использовать наследование

объектных типов. Это позволяет вам определять иерархии

типов базы данных.