Инициализация массива структур
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
sbk755 Участник
Вступление в Клуб: 27.04.2013
|
Ср Ноя 20, 2013 16:44  Инициализация массива структур |
|
Полезность: Нет оценки
|
Уважаемые форумчане,
есть необходимость, чтобы операция (тип "простая") возвращала массив значений определенной структуры.
Однако. как я понимаю, чтобы операция могла возвратить тип "массив структур" необходимо создать новую сущность с типом "массив" в администраторе словаря данных.
Инициализирую переменную "массив структур" через "insert" в данную переменную, но это физическая вставка данных в таблицу, а возможно ли инициализация не через "insert", а каким-либо другим способом чтобы значения были сохранены в виде массива значений, но без вставки в таблицу?
Документация говорит, о том что к переменной с типом "массив структур" применим "%init", но как то у меня не получилось его использовать для инициализации переменной такого типа. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Чт Ноя 21, 2013 06:05  Re: Инициализация массива структур |
|
Полезность: Нет оценки
|
sbk755 пишет: | Уважаемые форумчане,
есть необходимость, чтобы операция (тип "простая") возвращала массив значений определенной структуры.
Однако. как я понимаю, чтобы операция могла возвратить тип "массив структур" необходимо создать новую сущность с типом "массив" в администраторе словаря данных.
Инициализирую переменную "массив структур" через "insert" в данную переменную, но это физическая вставка данных в таблицу, а возможно ли инициализация не через "insert", а каким-либо другим способом чтобы значения были сохранены в виде массива значений, но без вставки в таблицу?
Документация говорит, о том что к переменной с типом "массив структур" применим "%init", но как то у меня не получилось его использовать для инициализации переменной такого типа. |
Почему бы не описать требуемую функцию в операции с типом "Библиотека"? |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Чт Ноя 21, 2013 09:37   |
|
Полезность: Нет оценки
|
Код: |
procedure copy_plan ( source [PLAN_OP], receiver [PLAN_OP]) is
plan [PLAN_OPER];
begin
if source%size(0) = 0 then return; end if;
if receiver%size(0) > 0 then receiver%delete;
end if;
for x in source loop
plan := x;
-- тут инициализация
plan%init(true, true);
-- тут вставка в БД
receiver%insert(plan);
end loop;
end;
|
|
|
 |
sbk755 Участник
Вступление в Клуб: 27.04.2013
|
Пт Ноя 22, 2013 05:06   |
|
Полезность: Нет оценки
|
Спасибо всем откликнувшимся.
Попробую уточнить свой вопрос (по структурам в приведенном примере кода).
Предположим что структура [PLAN_OPER] создана таким образом, что не может иметь экземпляров. На базе ее создан тип "массив" [PLAN_OPER_RE_ARR] и объявлен как возращаемый тип операции.
declare
plan_oper_ [PLAN_OPER];
plan_oper_ar_ [PLAN_OPER_RE_ARR];
begin
....
--блок инициализации "plan_oper_" необходимыми значениями
....
--помещение накопленной "plan_oper_" в "plan_oper_ar_"
insert plan_oper_ into plan_oper_ar_;
end;
Как я понимаю иного способа помещения значений типа "запись" (plan_oper_) в тип "массив" (plan_oper_ar_) не существует кроме как непосредственной вставки записи в таблицу z#plan_oper?
То есть я не могу из операции вернуть массив значений в виде действительно массива хранящего необходимые значения на уровне переменных пакета БД, а не данных таблицы? |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пт Ноя 22, 2013 09:09   |
|
Полезность: Нет оценки
|
sbk755 пишет: | Спасибо всем откликнувшимся.
Попробую уточнить свой вопрос (по структурам в приведенном примере кода).
Предположим что структура [PLAN_OPER] создана таким образом, что не может иметь экземпляров. На базе ее создан тип "массив" [PLAN_OPER_RE_ARR] и объявлен как возращаемый тип операции.
declare
plan_oper_ [PLAN_OPER];
plan_oper_ar_ [PLAN_OPER_RE_ARR];
begin
....
--блок инициализации "plan_oper_" необходимыми значениями
....
--помещение накопленной "plan_oper_" в "plan_oper_ar_"
insert plan_oper_ into plan_oper_ar_;
end;
Как я понимаю иного способа помещения значений типа "запись" (plan_oper_) в тип "массив" (plan_oper_ar_) не существует кроме как непосредственной вставки записи в таблицу z#plan_oper?
То есть я не могу из операции вернуть массив значений в виде действительно массива хранящего необходимые значения на уровне переменных пакета БД, а не данных таблицы? |
Наверное, нужно не просто массив сделать, а вложенный массив?
Тогда будет объявлен тип Oracle соответствующего типа, а с ним уже можно работать как с nested-varray.
А в целом не понимаю, почему не объявить type ttt is table of [PLAN_OPER]%rowtype index by и работать с этим массивом в процедурах и функциях библиотек, зачем именно операция, возвращающая данный тип? |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
|
 |
sbk755 Участник
Вступление в Клуб: 27.04.2013
|
Пт Ноя 22, 2013 12:06   |
|
Полезность: Нет оценки
|
Я понимаю, что можно объявить пользовательский тип в библиотеке и сделать реализацию через переменную данного типа. Но ведь объявленный пользовательский тип не сделаешь возращаемым типом операции.
Просто использование некой переменной в библиотеке делает не очевидным без анализа кода, то что действительно возращает операция.
А так достаточно было бы посмотреть на описание операции - есть возращаемый тип, значит его и ловим на выходе. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|