□ 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 ( )