В следующих примерах добавляются строки в таблицы cars и
motorcycles:
П INSERT INTO cars VALUES (
t_car(1, ‘ Toyota’ , ‘MR2’ , 'Y’ )
INSERT INTO motorcycles VALUES (
t_motorcycle(1, ‘ Harley_Davidson’ , ‘ V-Rod , N )
);
Следующие запросы выводят строки из таблиц cars и motorcycles.
□ SELECT *
FROM cars;
ID MAKE MODEL С
1 Toyota MR2 Y
SELECT *
FROM motorcycles;
ID MAKE MODEL S
1 Harley-Davidson V-Rod N
Объекты базы данных 435
Конструкторы, определенные пользователем
Как и в других объектно-ориентированных языках программирования, таких
как Java или C++, в PL/SQL можно определять собственные конструкторы
для инициализации атрибутов объекта. Вы можете определить свой
собственный конструктор, чтобы выполнять такие действия, как программная
установка атрибутов нового объекта в значения по умолчанию.
В следующем примере создается тип t_person2, который объявляет два
метода конструктора с различным числом параметров:
□ CREATE TYPE t _ p e r s o n 2 AS OBJECT (
i d INTEGER,
f i r s t _ n am e VARCHAR2(10),
la s t_ n ame VARCHAR2(10),
dob DATE,
phone VARCHAR2(1 2 ) ,
CONSTRUCTOR FUNCTION t_ p e r s o n 2 (
p _ id INTEGER,
p _ f i r s t _ n am e VARCHAR2,
p _ la s t_ n ame VARCHAR2
) RETURN SELF AS RESULT,
CONSTRUCTOR FUNCTION t_ p e r s o n 2 (
p _ id INTEGER,
p _ f i r s t _ n am e VARCHAR2,
p _ la s t_ n ame VARCHAR2,
p_dob DATE
) RETURN SELF AS RESULT
);
/
Обратите внимание на следующие связанные с конструкторами моменты.
■ Ключевые слова CONSTRUCTOR FUNCTION используются для идентификации
конструкторов.
■ Ключевые слова RETURN SELF AS RESULT показывают, что каждый
конструктор возвращает текущий объект, который обрабатывается;
SELF представляет текущий обрабатываемый объект. Это означает,
что конструктор возвращает новый объект, который он создаёт.
■ Первый конструктор принимает три параметра ( p _ id , p _ f i r s t_ n am e ,
и p _ l a s t _ name), второй конструктор принимает четыре параметра
(p _ id , P _ f i r s t_ n am e , p _ la s t_ n ame , и p_dob).
Объявления конструкторов не содержат реальных кодов тела конструкторов;
код содержится в теле типа, который создаётся при помощи следующего
выражения:
□ CREATE TYPE BODY t _ p e r s o n 2 AS
CONSTRUCTOR FUNCTION t_ p e r s o n 2 (
p _ id INTEGER,
p _ f i r s t _ n am e VARCHAR2,
p _ la s t_ n ame VARCHAR2
) RETURN SELF AS RESULT IS
436 Глава 12
BEGIN
S E L F . id := p _ id;
S E L F . f i r s t _ n am e := p _ f i r s t_ n am e ;
S E L F . la s t_ n am e := p_ la s t_name ;
S E L F .d o b := SYSDATE;
SELF, phone := ‘ 5 5 5 -1 2 1 2 ’ ;
RETURN;
END;
CONSTRUCTOR FUNCTION t _ p e r s o n 2 (
p _ id INTEGER,
p _ f i r s t _ n am e VARCHAR2,
p _ la s t_ n ame VARCHAR2,
p_dob DATE
) RETURN SELF AS RESULT IS
BEGIN
S E L F . id := p _ id;
S E L F . f i r s t _ n am e := p _ f i r s t_ n am e ;
S E L F . la s t_ n am e := p_ la s t_name ;
S E L F .d o b := p_dob;
S E L F .p h o n e := ‘ 5 5 5 - 1 2 1 3 ’ ;
RETURN; - *
END;
END;
/
Отметим следующее.
■ Конструктор использует SELF для ссылки на вновь создаваемый объект.
Например, SELF, i d := p. id устанавливает атрибут нового объекта
id равным параметру p_id, который передается в конструктор.
■ Первый конструктор устанавливает атрибуты id, first_name, и last_
name attributes в значения параметров p_id, p_first_name, и p_last_
name, передаваемых в конструктор; атрибут dob устанавливается в
текущее значение даты-времени, возвращаемое SYSDATE ( ) , а атрибут
phone устанавливается на 555-1212.
■ Первый конструктор устанавливает атрибуты id, f irst_name, last_
name, и dob в значения параметров p_id, p _ f irst_name, p_last_name,
и p_dob, передаваемых в конструктор; оставшийся атрибут phone
устанавливается на 555-1213.
Хотя он не показан, база данных автоматически создаёт конструктор
по умолчанию, который принимает пять параметров и устанавливает каждый
атрибут в соответствующее значение параметра, передаваемого в
конструктор. Вы увидите пример этого ниже.
Примечание Конструкторы показывают пример перегрузки метода, поскольку в одном и том
же типе объявлены методы с одинаковым именем, но разными параметрами. Метод может
быть перегружен путём указания разного числа параметров, типа параметров, а также порядка
их следования.
Следующий пример описывает t_person2; обратите внимание на определения
конструкторов в выходных данных:
Объекты базы данных 437
□ DESCRIBE t _ p e r s o n 2
Name N u l l? T y p e
ID NUMBER(38)
FIRST_NAME VARCHAR2(10)
LAST_NAME VARCHAR2(10)
DOB DATE
PHONE VARCHAR2(12)
METHOD
FINAL CONSTRUCTOR FUNCTION T_PERS0N2 RETURNS SELF AS RESULT
Argument Name Type In /O u t D e f a u l t ?
P_ID NUMBER IN
P_FIRST_NAME VARCHAR2 IN
P_LAST_NAME VARCHAR2 IN
METHOD ' ~
FINAL CONSTRUCTOR FUNCTION T_PERS0N2 RETURNS SELF AS RESULT
Argument Name Type In /O u t D e f a u l t ?
P_ID NUMBER IN
P_FIRST_NAME VARCHAR2 IN
P_LAST_NAME VARCHAR2 IN
P_DOB DATE IN
Следующее выражение создаёт таблицу типа t_ p e r s o n 2 :