Как задать и использовать константу в виде коллекции на Pl/SQL.

Иногда в реальных задачах необходимо в константах хранить какую-либо коллекцию. На языке pl/sql просто создать коллекцию и перечислить через запятую данные, которые она будет содержать, нельзя. Такое возможно только с массивами, у которых строго задан размер и тип элементов. Если же возникла необходимость сделать предопределенную коллекцию-константу, то в этом случае её не получится проинициализировать простым перечислением данных. Чтобы проинициализировать коллекцию–константу, необходимо задать функцию, которая вернет заполненную коллекцию для присвоения её в указанную переменную. Выглядеть это будет примерно так, как показано ниже.

Например, мы хотим создать коллекцию действий пользователя, индекс элемента которой будет представлять собой символьный код операции, а значение — название операции, которое увидит пользователь. Зададим возможные действия константами, так как в дальнейшем в программе они обрабатываются.
[code]
subtype typeActionName is varchar2(50); — Тип: Код действия
type typeActionCol is table of typeActionName — Тип: Список действий
index by varchar2(200);

cOperSetDefault constant typeOperName:= ‘SetDefault’;
cOperUndoDefault constant typeOperName:= ‘UndoSetDefault’;
cOperChangeParam constant typeOperName:= ‘ChangeParam’;
cOperClose constant typeOperName:= ‘CLOSE’;
cOperOpen constant typeOperName:= ‘UNCLOSE’;
cOperDelete constant typeOperName:= ‘Delete’;
cOperAddItem constant typeOperName:= ‘AddItem’;

function setActionCollection return typeOperCol; —функция задания массива кода операции и имени операции

ActionCollection constant typeOperCol:= setActionCollection; —список действий пользователя

function setActionCollection return typeActionCol
is
pOperCol typeActionCol;
begin
pOperCol(cActionSetDefault) := ‘Установить параметры по умолчанию’;
pOperCol(cActionUndoDefault) := ‘Вернуть параметры, которые были до сброса’;
pOperCol(cActionCloseAgree) := ‘Закрыть соглашение’;
pOperCol(cActionOpenAgree) := ‘Открыть соглашение’;
pOperCol(cActionChangeParam) := ‘Изменить значение параметров;
pOperCol(cActionDelete) := ‘Удалить элемент’;
pOperCol(cActionAddItem) := ‘Добавить элемент’;
return pOperCol;
end;
[/code]

Таким образом можно задать коллекцию, содержащую данные любого составного типа. В зависимости от типа будет меняться только функция его заполнения (либо усложнятmся, либо упрощаться). После того, как мы объявили свою константу, возникает вопрос: как выполнить какие-либо операции при помощи данных, которые мы проинициализировали? Если рассматривать коллекцию, которую я привела выше, то для обхода её потребуется массив индексов.
[code]
type typeColkeys is varray(7) of typeOperName;

—массив для индексации действий
Collectionkeys typeColkeys := typeColkeys (cActionSetDefault, cActionUndoDefault, cActionCloseAgree, cActionOpenAgree, cActionChangeParam, cActionDelete, cActionAddItem);
[/code]

А после этого можно будет пройти по коллекции циклом и выполнить необходимые вам операции.

[code]
FOR i IN 1..ActionCollection.count loop
—выполняем необходимые операции
—Collectionkeys(i) – это будет код действия пользователя
—ActionCollection(Collectionkeys(i)) –это будет заголовок действия
end loop;
[/code]

Вещи, конечно, несложные, но приводят к ошибкам и вопросам. Один раз использовав такую конструкцию, вы обязательно запомните, как лучше с ней работать. В функции инициализации можно заполнить коллекцию и из базы, если вам необходимо подгружать информацию, а не хранить её напрямую в пакете. В этом случае придется также и подумать над тем, что использовать в качестве массива индексов, так как при создании у массива задается определенное количество элементов, что при загрузке из базы просто не приемлемо.

Tags: , ,

One Response to “Как задать и использовать константу в виде коллекции на Pl/SQL.”

Leave a Reply