Курсор по полям переменной типа RECORD
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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; |
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|