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

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


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

1405

вательский код этот стандартный конструктор не выполняет. Другими словами, он может использоваться только для установки атрибутов объектного типа. Это не слишком удобно. Статическая функция OPEN в представленном выше типе будет использоваться для демонстрации создания собственных, куда более полезных (и сложных), конструкторов для типов. Обратите внимание, что функция OPEN - часть объектного типа FILIYPE сама возвращает данные типа FILETYPE. Она выполняет необходимую настройку и возвращает полностью инициализированный объект. Именно для этого в основном используются статические функции-члены в объектных типах: с их помощью создают сложные конструкторы объектов. Статические функции и процедуры в объектном типе отличаются от остальных процедур и функций тем, что не получают неявного параметра SELF. Эти функции похожи на функции или процедуры пакета. Они при-годятсядля реализации общих утилит, вызываемых другими методами, но не требующих доступа к данным экземпляра (атрибутам объекта). Процедура WRITE IO в представленном выше объектном типе - пример такого рода утилиты. Я использую ее для обращения к пакету UTL FILE, связанного с записью в файл, так что не приходится каждый раз повторять 14-строчный блок обработки исключительных ситуаций.

Обратите внимание, что в этом объектном типе нет ссылок на тип данных UTL FILE.FILE TYPE, поскольку атрибуты объектного типа могут быть только SQL-типов. Эту запись необходимо сохранить в другом месте. Для этого я собираюсь использовать PL/SQL-пакет следующего вида:

tkyte@TKYTE816> create or replace package FileType pkg 2 as

6 7 8 9

11 12 13 14 15 16 17 18 19

21 g read error msg constant varchar2(131) default

22 READ ERROR: В ходе операции чтения оизошла ошибка операционной систем!. ;

type utl fileArrayType is table of utl file.file type index by binary integer;

g files utl fileArrayType;

g invalid path msg constant varchar2(131) default INVALID PATH: Недостимое местонахождение или имя файла. ;

g invalid mode msg constant varchar2(131) default INVALID MODE: Недостм1й параметр open mode %s в вызове FOPEN. ;

g invalid filehandle msg constant varchar2(131) default INVALID FILEHANDLE: Недостим1й дескриптор файла. ;

g invalid operation msg constant varchar2(131) default INVALID OPERATION: Файл нельзя открыть или обработать так, как запрошено.;

23 24

26 27

g write error msg constant varchar2(131) default WRITE ERROR: В ходе операции записи произошла ошибка операционной систем!. ;



1406

Глава 2 0

29 g internal error msg constant varchar2(131) default

30 INTERNAL ERROR: Неопределенная ошибка в PL/SQL.; 31

32 g invalid maxlinesize msg constant varchar2(131) default

33 INVALID MAXLINESIZE: Указанный максимальный размер строки %d - II

34 слишком велик или слишком мал;

35 end;

36 /

Package created.

Этот пакет будет использоваться для хранения записей типа UTL FILE.FILE TYPE в процессе выполнения. Каждый экземпляр объектного типа (переменная) FILE TYPE будет выделять себе пустой слот в представленном выше массиве G FILES. Это показывает, как создавать приватные данные в объектных типах Oracle. Реальные данные времени выполнения будут храниться в переменной пакета GFILES, а в объектном типе - только дескриптор (индекс в массиве). В текущей реализации объектов в Oracle все данные объектного типа - общедоступны. Невозможно создать скрытый атрибут типа, недоступный для пользователей. Например, в случае представленного выше типа FILE TYPE вполне можно обратиться к переменной экземпляра G FILE NAME непосредственно. Если это нежелательно, необходимо скрыть эту переменную в PL/SQL-пакете так же, как мы скр1ли там тип PL/SQL-записи. Никто не сможет обратиться данным в PL/SQL-пакете, не получив привилегию EXECUTE для этого пакета, поэтому данные защищены.

Этот пакет также используется для хранения ряда констант. Объектные типы не поддерживают неизменяемые данные, поэтому пакет представляет собой удачное место для их хранения.

Я предпочитаю называть пакет, поддерживающий тип подобным образом, так, чтобы в его имя входило имя типа. Поскольку мы создали тип FILETYPE, для его поддержки создан пакет FILETYPE PKG. Теперь можно переходить к телу типа FILETYPE. Оно будет содержать все представленные ранее методы, статические функции и процедуры. Ниже приведен код с комментариями.

tkyte@TKYTE816>create or replace type body FileType

2 as

4 static function open(p path in varchar2,

5 p file name in varchar2,

6 p mode in varchar2 default r,

7 p maxlinesize in number default 32765)

8 return FileType

9 is

10 l file hdl number;

11 l utl file dir varchar2(1024);

12 begin

13 l file hdl := nvl(fileType pkg.g files.last, 0)+l;

15 filetype pkg.g files(l file hdl) :=

16 utl file.fopen(p path, p file name, p mode, p maxlinesize);



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

18 return fileType(p file name, p path, l file hdl);

Представленная выше часть статической функции OPEN отвечает за поиск свободного слота в приватнтх данных (скрыттх в пакете fileype pkg). Для этого она добавляет единицу к значению атрибута LAST PL/SQL-таблицы. Если таблица пуста, LAST имеет значение NULL, поэтому его значение передается функции NVL, и первое вгделяемое значение будет иметь индекс ]. Следующее - 2 и так далее. Функция CLOSE будет удалять записи при закрытии файла, так что место в массиве при открытии и закрытии файлов будет использоваться повторно. Остальная часть функции очень проста; она открывает указанный файл и возвращает готовый к использованию, полностью проини-циализированный экземпляр объекта FILETYPE. Далее в функции FILETYPE.OPEN идет блок обработки исключительных ситуаций, позволяющий перехватить и обработать все ошибки, которые могут возникнуть при выполнении функции UTL FILE.FOPEN:

19 exception

20 when utl file.invalid path then

21 begin

22 execute immediate select value

23 from v$parameter

24 where name = utl file dir

25 into l utl file dir;

26 exception

27 when others then

28 l utl file dir := p path;

2 9 end;

30 if (instr( l utl file dir p path ,) = 0 )

31 then

32 raise application error

33 (-20001,Каталог p path

34 не входит в список каталогов utl file dir

3 5 l utl file dir ) ;

36 else

37 raise application error

38 (-20001,fileType pkg.g invalid path msg); 3 9 end if;

40 when utl file.invalid mode then

41 raise application error

42 (-20002,replace(fileType pkg.g invalid mode msg,%s,p mode));

43 when utl file.invalid operation then

44 raise application error

45 (-20003,fileType pkg.g invalid operation msg);

46 when utl file.internal error then

47 raise application error

48 (-20006,fileType pkg.g internal error msg);

49 when utl file.invalid maxlinesize then

50 raise application error

51 (-20007, replace(fileType pkg.g invalid maxlinesize msg,

52 %d,p maxlinesize));

53 end;



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

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