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

Курсор по полям переменной типа RECORD

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mourinjo
Участник со стажем


Вступление в Клуб: 21.12.2010
СообщениеСр Апр 22, 2020 08:02   Курсор по полям переменной типа RECORD Ответить с цитатой
Полезность: Нет оценки
Добрый день, уважаемые гуру ЦФТ!
Подскажите пжл, есть
type A is record
(
b number,
c number,
…..
z number
);
r_a A;

Так как полей записи может быть куча, как динамически пройти по полям записи используя скажем курсор или цикл ?
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеСр Апр 22, 2020 10:22    Ответить с цитатой
Полезность: Нет оценки
не совсем понял что тебе надо, но есть два варианта, для динамического обхода.

1) table вложенный в record, тогда ты можешь адресовать поля по номерам, т.е. у тебя будет вложенный цикл (основной по записям вложенный по полям)

for i in
for j in

x := a(i).par(j)

2) Есть такая штука как %rowtype, посмотри в администраторе словаря примеры, но это для присваивания, компилятор сам сгенерит pl/sql код по всем полям
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеЧт Апр 23, 2020 09:37    Ответить с цитатой
Полезность: Нет оценки
Посмотри rtl_entries и rtl_patameters.
В этих таблицах содержится результат работы синтактического анализатора.
Документации по этому нет, т.к. это внутренние структуры компилятора pl+, но разобраться можно.
Как минимум использовал в двух задача
1) написание механизма перекрытия функций в библиотеках, когда нужно было понимать какие функции есть в библиотеке родительского,/дочернего типа. Там инфа по процедурам, функциям, параметрам , и возвращаемому значению.
2) подобная твоей задача. Когда нужно было получить описание структур в одной библиотеке, и на основании этого сделать другую библиотеку. К примеру другая библиотека может быть библиотекой функций Is_empty, определяющих понятие пустоты для структур описанных в первой библиотеке.
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеЧт Апр 23, 2020 09:44    Ответить с цитатой
Полезность: 2
Дарю.
Код:
for (
         select re(
         re.[ID]                              TYPE_ID ,
         regexp_replace(re.[NAME],'.*\.(.*)','\1')     TYPE_NAME,
         re.[PARAMS]                           PARAMS_COUNT --     для массивов НОЛЬ  , для простых типов и псевдонимов NULL
         
         )
         in RTL_ENTRIES%rowtype
         where
            re.method_id=P_METHOD
               and
            re.type='T' --из указанной библиотеки берем только описания типов
      order by re.[ID] asc
      )
   loop
      if re.[PARAMS_COUNT]>0
      then
         for
            (select rp(rp%rowtype)
            in RTL_PARAMETERS%rowtype
            where
               rp.rtl_id=re.[TYPE_ID]
            order by rp.[POS] asc
            )
         loop
            null;
         end loop;
      else
         continue;
      end if;
      
   end loop;
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

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