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

1 ... 325 326 327 [ 328 ] 329 330 331 ... 469


1402

Глава 20

Вложенная таблица

Для получения данных строки при использовании вложенных таблиц необходимо выполнять реляционное соединение. В случае небольших наборов это повлечет чрезмерное использование ресурсов.

VARRAY

Для получения данных массива VARRAY соединение выполнять не нужно. В случае небольших наборов данные хранятся в самой строке; если же наборы большие -в сегменте большого объекта. При обращении к элементам массива VARRAY требуется меньше ресурсов, чем при обращении к вложенной таблице. При изменении же данных массива VARRAY ресурсов требуется больше, чем при изменении вложенной таблицы, поскольку заменять приходится весь массив, а не один элемент.

В представленной выше таблице указано, что массив VARRAY нельзя изменять с помощью SQL-операторов с конструкцией TABLE; его надо обрабатывать процедурно. Для изменения столбцов типа VARRAY лучше всего написать хранимую процедуру. Ее код может быть примерно таким:

tkyte@TKYTE816> declare

7 8 9

10 11 12 13 14 15

16 end;

17 /

address Array Type;

l prev addresses begin

select p.previous addresses

from people p where p.name = Tom Kyte;

into l prev addresses

l prev addresses.extend; l prev addresses(l prev addresses.count) Address Type(12 3 Main Street, null, Reston , VA , 45678) ;

update people

set previous addresses where name = Tom Kyte;

l prev addresses

PL/SQL procedure successfully completed.

tkyte@TKYTE816> select name, prev.city, prev.state, prev.zip code

2 from people p, table(p.previous addresses) prev

NAME

CITY

ZIP CODE

Tom Kyte

Bethlehem

18017

Tom Kyte

Pittsburg

18123

Tom Kyte

Alexandria

20654

Tom Kyte

Reston

45678

Мы рассмотрели преимущества и недостатки использования расширенных типов данных Oracle в таблицах базы данных. Вы должны решить, стоит ли ради возможности



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

создавать новые типы данных с однозначно реализованными методами обработки и использовать их в определениях столбцов, жертвовать возможностью развивать эти типы со временем (добавлять или удалять атрибуты).*

Мы также сравнили использование массивов VARRAY и вложенных таблиц как способов физического хранения данных. Было показано, что массивы VARRAY больше подходят для хранения ограниченного набора упорядоченных элементов, чем вложен-н1е таблицы. Использовать массивы VARRAY очень удобно для хранения списка элементов, которому не требуется отдельная таблица.

Избирательное использование новых типов существенно улучшает систему и ее структуру. Использование объектн1х типов Oracle в качестве типов столбцов таблиц (но не создание объектных таблиц, как было продемонстрировано в главе 6) позволяет обеспечить стандартизацию и вызов процедур (методов) с семантически правильными параметрами. Огорчает только невозможность существенно развивать тип данных схемы после того, как создана хотя бы одна таблица, в которой этот тип используется.

Использование типов для расширения возможностей языка PL/SQL

Именно в этом объектно-реляционные средства Oracle максимально преуспели. Язык PL/SQL - очень гибкий и мощный, как доказывает уже то, что механизм расширенной репликации (Advanced Replication) был написан полностью на PL/SQL еще в версии Oracle 7.1.6. Приложения из набора Oracle Applications (Human Resources - управление персоналом, Financial Applications - бухгалтерский учет, CRM applications - управление ресурсами и т.д.) разработаны в основном на PL/SQL. Хотя это и замечательный язык программирования, встречаются ситуации, когда его базовые возможности требуется расширить (как и в случае языков Java, С, С + + или любых других языков программирования). Это можно сделать с помощью объектных типов. Они добавляют новые функциональные возможности в PL/SQL, как классы - в языках Java или С++.

В этом разделе я продемонстрирую, как использовать объектные типы для упрощения программирования на PL/SQL. Будет создан тип данных File на основе средств пакета UTL FILE. UTL FILE - это стандартный пакет, поставляемый в составе сервера Oracle и позволяющий выполнять в PL/SQL операции ввода-вывода (чтение и запись) текстовых данных в файлы на сервере. Он обеспечивает функциональный интерфейс, аналогичн1й семейству f-функций языка С (fopen, fclose, Iread, Iwrite и т.д.). Функцио-нальн1е возможности пакета UTL FILE будут инкапсулированы в простой в использовании объектный тип.

Создание нового типа данных PL/SQL

Пакет UTL FILE возвращает записи PL/SQL (данные типа RECORD). Это несколько усложняет работу, но проблему можно решить. Усложнение связано с тем, что объект-н1й тип SQL может содержать только SQL-типы, но не типы данных PL/SQL. Поэтому

Хочу отметить, что в версии Oracle 9i ситуация принципиально меняется, поскольку появляется возможность развивать систему типов за счет наследования. - Прим. научн. ред.



1404

Глава 20

нельзя создать объектный тип, содержащий атрибут типа записи PL/SQL, но нам эю необходимо, чтобы инкапсулировать функциональные возможности существующего пакета. Чтобы решить эту проблему, придется создать вместе с типом небольшой PL/SQL-пакет.

Начнем со спецификации типа - прототипа того, что мы планируем создать:

tkyte@TKYTE816> create or replace type FileType

10 11

13 14 15 16

18 19 20 21

25 26

28 29

31 32 33 34 35 36

as object (g file name

g path

g file hc

varchar2(255), varchar2(2 55), number.

static function open(p path

p file name p mode p maxlinesize return FileType,

in varchar2, in varchar2,

in varchar2 default r, in number default 32765)

member function isOpen return boolean, member procedure close,

member function get line return varchar2,

member procedure put(p text in varchar2) ,

member procedure new line(p lines in number default 1) ,

member procedure put line(p text in varchar2) ,

member procedure putf(p fmt in varchar2,

p argl in varchar2 default null, p arg2 in varchar2 default null, p arg3 in varchar2 default null, p arg4 in varchar2 default null, p arg5 in varchar2 default null) ,

member procedure flush.

static procedure write io(p file

number,

p operation

varchar2,

p parml

varchar2

default

null.

p parm2

varchar2

default

null.

p parm3

varchar2

default

null.

p parm4

varchar2

default

null.

p parm5

varchar2

default

null.

p parm6

varchar2

default

null)

Type created.

Эта спецификация очень похожа на спецификацию пакета UTL FILE (если вы не знакомы с пакетом UTL FILE, можете прочитать о нем в приложении А). Он обеспечивает практически те же функциональные возможности, что и пакет UTL FILE, просто в более удобном (как мне кажется) виде. Помните, при рассмотрении создания типа ADDRESS TYPE я говорил, что каждый объектный тип имеет один стандартный конструктор и в этом конструкторе надо задать значения для всех атрибутов типа. Пользо-



1 ... 325 326 327 [ 328 ] 329 330 331 ... 469

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