![]() |
|
Программирование >> Oracle
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
Это очень удобно для определения поддерживаемых атрибутов. Теперь давайте немного усложним тип 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;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |