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, вы можете использовать наследование
объектных типов. Это позволяет вам определять иерархии
типов базы данных.