CftClub.ru
Клуб специалистов ЦФТ-Банк

Инициализация массива структур

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
СообщениеПт Ноя 22, 2013 09:57    Ответить с цитатой
Полезность: Нет оценки
sbk755,
смотрели эти темки ?

http://www.cftclub.ru/viewtopic.php?t=2130&highlight=pipeline

http://www.cftclub.ru/viewtopic.php?t=2050&highlight=pipeline
sbk755
Участник


Вступление в Клуб: 27.04.2013
СообщениеПт Ноя 22, 2013 12:06    Ответить с цитатой
Полезность: Нет оценки
Я понимаю, что можно объявить пользовательский тип в библиотеке и сделать реализацию через переменную данного типа. Но ведь объявленный пользовательский тип не сделаешь возращаемым типом операции.
Просто использование некой переменной в библиотеке делает не очевидным без анализа кода, то что действительно возращает операция.
А так достаточно было бы посмотреть на описание операции - есть возращаемый тип, значит его и ловим на выходе.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru