Программирование >>  Oracle 

1 ... 321 322 323 [ 324 ] 325 326 327 ... 469


1390 Глава 20

6 / Таblеcreated.

tkyte@TKYTE816> declare

2 l home address address type;

3 l work address address type;

4 begin

5 l home address := Address Type(123 Main Street, null,

6 Reston, VA, 45678);

7 l work address :=Address Type(l OracleWay, null,

8 Redwood, CA, 23456);

10 insert into people

11 (name, home address, work address)

12 values

13 (TomKyte, l home address, l work address);

14 end;

15 /

PL/SQL procedure successfully completed. tkyte@TKYTE816>select * from people;

NAME HOME ADDRESS(STREET WORK ADDRESS(STREET

Tom Kyte ADDFESS TYPE(12 3 Ma ADDRESS TYPE(1 Orac in Street, NULL, R le Way, NULL, Redw eston, V, 45678) ood, C, 23456)

Как видите, использовать этот новый тип в операторе CREATE TABLE так же легко, как, например, тип NUMBER. Кроме того, объявлять переменные типа ADDRESS TYPE в PL/SQL тоже просто: в языке PL/SQL новые типы данных можно использовать сразу же. Новые функциональные возможности использованы в приведенном PL/SQL-коде в строках с 5 по 8. Здесь вызывается конструктор объекта нового типа. Стандартный конструктор типа позволяет задать значения для всех атрибутов объектного типа. По умолчанию создается только один стандартный конструктор, при вызове которого надо указать значения для всех атрибутов типа. В разделе Использование типов для расширения возможностей PL/SQL мы рассмотрим, как создавать специфические конструкторы с помощью статических функций-членов.

Созданные переменные типа ADDRESS TYPE после инициализации можно использовать в качестве связываемых переменных в SQL-операторах, как б1ло показано выше. Достаточно просто вставить значения столбцов NAME, HOME ADDRESS и WORK ADDRESS. Несложный SQL-запрос позволяет получить эти данные. С помощью SQL можно обращаться не только к столбцу HOME ADDRESS, но и к каждому из компонентов HOME ADDRESS. Например:

tkyte@TKYTE816> select name, home address.state, work address.state

2 from people

selectname,home address.state,work address.state

ERROR at line 1:

ORA-00904: invalid column name



Использование объектно-реляционных средств

1391

tkyte@TKYTE816> select name, P.home address.state, P.work address.state

2 from people P

NAME HOME ADDRESS.STATE WORK ADDRESS.STATE

Tom Kyte VA CA

Я продемонстрировал неправильный и правильный способ. Первый пример - это то, что обычно пишут разработчики. Запрос, конечно, не работает. Чтобы обратиться к компонентам объектного типа, необходимо использовать корреляционное имя, как сделано во втором запросе. В нем я задал для таблицы PEOPLE псевдоним P (можно использовать любой допустимый идентификатор, включая слово PEOPLE). Если возникает необходимость сослаться на отдельные компоненты адреса, я использую псевдоним.

Как же выглядит в действительности таблица PEOPLE? То, что показывает сервер Oracle, весьма отличается от того, что используется на самом деле, как можно догадаться, прочитав главу 6 и изучив примеры с вложенной или объектной таблицей:

tkyte@TKYTE816> desc people

Name

Null?

Type

NAME

HOME ADDRESS WORK ADDRESS tkyte@TKYTE816> select

name, length

NAME

from sys.col$

where obj#

(select object id

from user objects where object name =

LENGTH

VARCHAR2(10) ADDRESS TYPE ADDRESS TYPE

PEOPLE)

NAME

HOME ADDRESS SYS NC00003$ SYS NC00004$ SYS NC00005$ SYS NC00006$ SYS NC00007$ WORK ADDRESS SYS NC00009$ SYS NC00010$ SYS NC00011$ SYS NC00012$ SYS NC00013$

13 rows selected.

10 1

25 25 30

22 1

25 25 30 2

Сервер Oracle сообщает, что в таблице - три столбца, но в реальном словаре данных их, однако, - тринадцать. В нем можно обнаружить скрытые скалярные столбцы. Хотя все не так очевидно и используются скрытые столбцы, применять скалярные объектные типы (без вложенных таблиц) подобным образом несложно. С такого рода неоче-



1392

Глава 20

видностью вполне можно смириться. Если использовать опцию SET DESCRIBE утилиты SQL*Plus, можно заставить эту утилиту показывать всю структуру объектного типа:

tkyte@TKYTE816> set describe depth all tkyte@TKYTE816> desc people Name Null?

Type

NAME

VARCHAR2(10)

HOME ADDRESS

ADDRESS TYPE

STREET ADDR1

VARCHAR2(25)

STREET ADDR2

VARCHAR2(25)

CITY

VARCHAR2(30)

STATE

VARCHAR2(2)

ZIP CODE

NUMBER

WORK ADDRESS

ADDRESS TYPE

STREET ADDR1

VARCHAR2(25)

STREET ADDR2

VARCHAR2(25)

CITY

VARCHAR2(30)

STATE

VARCHAR2(2)

ZIP CODE

NUMBER

Это очень удобно для определения поддерживаемых атрибутов.

Теперь давайте немного усложним тип ADDRESSTYPE: добавим функцию в1дачи адреса в удобном формате в виде одного поля. Для этого можно добавить в тело типа соответствующую функцию-член:

tkyte@TKYTE816> alter type Address Type

10 11

BEPLACE as object

(street addrl

street addr2

city

state

zip code

varchar2(25), varchar2(25), varchar2(30), varchar2(2), number,

member function toString return varchar2

Type altered.

tkyte@TKYTE816> create or replace type body Address Type

2 as

3 member function toString return varchar2

4 is

5 begin

6 if (street addr2 is not NULL)

7 then

8 return street addrl chr(10)

9 street addr2 chr(10)

10 city , state

11 else

12 return street addrl chr(10)

13 city , state

zip code;

zip code;



1 ... 321 322 323 [ 324 ] 325 326 327 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика