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

□ CREATE TABLE o b j e c t _ c u s tom e r s 2 OF t_ p e r s o n 2 ;

Следующее выражение INSERT добавляет объект в таблицу; обратите

внимание, что в конструктор t _ p e r s o n 2 передаются три параметра:

□ INSERT INTO o b j e c t _ c u s tom e r s 2 VALUES (

t _ p e r s o n 2 (1, ‘ J e f f , ‘ J o n e s ’ )

);

Поскольку в t _ p e r s o n 2 передано три параметра, это выражение INSERT

выполняет первый конструктор. Этот конструктор устанавливает атрибуты

нового объекта id, first_name, и last_name в 1, Jeff, и Jones; оставшиеся

атрибуты dob и phone устанавливаются в результат, возвращаемый SYSDATE

(), и литерал 5 5 5 -1 2 1 2 . Следующий запрос получает новый объект:

П SELECT *

FROM o b je c t _ o u s t om e r s 2

WHERE i d = 1;

ID FIRST_NAME LAST_NAME DOB PHONE

1 J e f f J o n e s 1 7 - JUN-07 55 5-1212

438 Глава 12

Следующее выражение INSERT добавляет ещё один объект в таблицу,

обратите внимание, что в конструктор t _ p e r s o n 2 передано четыре параметра:

□ INSERT INTO o b j e c t _ c u s tom e r s 2 VALUES (

t _ p e r s o n 2 ( 2 , ‘ G r e g o r y ’ , ‘ Sm i t h ’ , ' 0 3 -A P R - 1 9 6 5’ )

);

Так как в t_person2 передано четыре параметра, это выражение INSERT

выполняет второй конструктор. Этот конструктор устанавливает атрибуты

объекта id, first_name, last_name, и dob соответственно в 2, Gregory,

Smith, и 03-APR-1965; оставшийся атрибут phone устанавливается в 555-

1213. Следующий запрос получает новый объект:

□ SELECT *

FROM o b j e c t _ c u s tom e r s 2

WHERE i d = 2;

ID FIRST_NAME LAST_NAME DOB PHONE

2 G r e g o r y Smith 03 -A PR-6 5 555-1213

Следующее выражение INSERT добавляет ещё один объект в таблицу.

Обратите внимание, что в конструктор t _ p e r s o n 2 передано пять параметров:

□ INSERT INTO o b j e c t _ c u s tom e r s 2 VALUES (

t _ p e r s o n 2 ( 3 , ‘ J e rem y ’ , ‘ H i l l ’ , ' 0 5 - JU N -1 9 7 5 ’ , ‘ 5 5 5 -1 2 1 4 ’ )

);

Поскольку в t _ p e r s o n 2 передано пять параметров, это выражение INSERT

выполняет конструктор по умолчанию. Этот конструктор устанавливает

атрибуты id, first_name, last_name, dob, и phone соответственно в 3, Jeremy,

Hill, 05-JUN-1975, и 555-1214. Следующий запрос получает новый объект:

П SELECT *

FROM o b j e c t _ c u s tom e r s 2

WHERE i d = 3;

ID FIRST_NAME LAST_NAME DOB PHONE

3 Jeremy H i l l 0 5 - JU N-7 5 55 5-1 214

Переопределение методов

Когда вы создаёте подтип под супертипом, вы можете переопределить метод

супертипа методом подтипа. Это удобный способ определения методов

в иерархии типов.

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

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

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

□ CREATE TYPE t _ p e r s o n 3 AS OBJECT (

i d INTEGER,

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

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

la s t_ n ame VARCHAR2(1 0 ) ,

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 3 AS

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

BEGIN

RETURN ‘ id = ’ M i d ||

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

END;

END;

/

Следующий набор выражений создаёт подтип по имени t_business_

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

( ) переопределена при помощи ключевого слова OVERRIDING, а функция

возвращает VARCHAR2, содержащий первоначальные и расширенные атрибуты

объекта:

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

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 3 AS

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

BEGIN

RETURN ‘ i d = ’ || i d ||

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

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

END;

END;

/

Использование ключевого слова OVERRIDING указывает, что display_

details () в t_biisiness_ person3 переопределяет d i s p l a y _ d e t a i l s ( ) в t _

p e r s o n 3 . Следовательно, когда происходит вызов d i s p l a y _ d e t a i l s ( ) в t_

business_person3, то вызывается 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 3 , а

не d i s p l a y _ d e t a i l s ( ) B t _ p e r s o n 3 .

Примечание В следующем разделе этой главы вы увидите, как можно напрямую вызвать

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

в супертипе. Прямой вызов можно выполнить при помощи обобщённого вызова - новой возможности,

появившейся в базе данных Oracle 11 д.

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

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

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

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

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

);

440 Глава 12

Следующий пример вызывает display_details (), используя object_

business_customers3:

□ SELECT о . d i s p l a y _ d e t a i l s ( )

FROM o b j e c t _ b u s in e s s _ c u s t om e r s 3 о

WHERE i d = 1;

0 . DIS PLAY _DE TAILS ( )