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

В следующих примерах добавляются строки в таблицы 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 :