Базы данных Oracle - статьи

         

Реализация констант-атрибутов типа


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

create or replace type t_ParentType as object ( v_Name varchar2(50), static v_Const varchar2(32) := 'Scott Tiger' );

Увы, мы получаем ошибку:

ORA-06545: PL/SQL: compilation error - compilation aborted ORA-06550: line 5, column 12: PLS-00103: Encountered the symbol "V_CONST" when expecting one of the following: function procedure

Для реализации таких атрибутов можно использовать статический метод, который бы возвращал требуемое значение. Если значение атрибута также имеет объектный тип, то в качестве места хранения значения такого атрибута можно использовать вспомогательный пакет. Для защиты переменной от модификации необходимо поместить её объявление в тело пакета.

Следующий листинг реализует данный подход:

-------------------------------------------------------------- --Значение данного типа должен иметь атрибут объектного типа - -------------------------------------------------------------- create or replace type t_DictConst as object ( v_Id number(9), v_Name varchar2(50), v_Code varchar2(15), v_Description varchar2(250) ); -------------------------------------------------------------- --Спецификация вспомогательного пакета для типа t_ParentType:- --функция getConst возвращает объект типа t_DictConst - -------------------------------------------------------------- create or replace package serv$ParentType is function getConst return t_DictConst; end; -------------------------------------------------------------- --Тело пакета: объект-константа формируется в процедуре init - -------------------------------------------------------------- create or replace package body serv$ParentType is

v_gDictConst t_DictConst; function getConst return t_DictConst is begin return v_gDictConst; end; procedure init is begin v_gDictConst := new t_DictConst(1,'Scott Tiger', '01','Scott Tiger - Oracle demo-user'); end; begin init; end;

Следующий объектный тип реализует статический метод, который возвращает объект-константу:

-------------------------------------------------------------- --Спецификация объектного типа t_ParentType - --Статический метод возвращает константу - -------------------------------------------------------------- create or replace type t_ParentType as object ( v_Name varchar2(50),

static function getConst return t_DictConst ); create or replace type body t_ParentType is

static function getConst return t_DictConst is begin return serv$ParentType.getConst; end; end;

Вышеописанная методика демонстрируется в данном примере .



Содержание раздела