Я пишу процедуру для обработки пользовательского объекта, который хранится в ANYDATA. Тип объекта и имя атрибута могут быть известны только во время выполнения, поэтому я не могу определить его видимость для него в разделе объявления. В Java я могу использовать размышления, чтобы справиться с этим, я могу узнать имя класса и имя поля. Затем я могу получить доступ к полям через отражение. Есть ли способ сделать это в PLSQL? Что в моей голове сейчас создает динамическую структуру sql в процедуре и выполняет ее. Но я не хочу этого точно.Отражение в PLSQL?
Предположим, пользователь A определил тип ADT как create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
и создал экземпляр объекта и ввел его в ANYDATA.
В моей процедуре я знаю, что мне нужно иметь дело с первым атрибутом этого объекта, который является fname. Так что, если знать ADT типа в первую очередь, мой код будет как:
declare
adobject A.Person_type; -- HERE! I don't know the type yet, so I can't define adobject!
tempAnydata anydata;
rt number;
vbuffer varchar2(10);
...
begin
select somecolumn
into tempAnydata
from sometable
where something='something' for update;
rt := tempAnydata.GetObject(adobject);
vbuffer := adobject.fname; -- HERE! I don't know the attribute name is fname!
-- deal with vbuffer here
end;
Так что я должен сделать, чтобы сделать его динамически? Заранее спасибо.
Если вы знаете, что 'tempAnydata' это * действительно *' A.person_type', как вы, конечно, делать (иначе вы не могли бы сделать 'GetObject (ADObject)' с ADObject именно этого типа) то вы * также * знаете, что такое первый атрибут этого типа. Или я чего-то не хватает? –
A.person_type - просто пример, это может быть любой пользовательский тип. Это может быть B.anymal_type или что-то еще. – icespace
Статическая сильная типизация сосет. (сварливый старый Smalltalker блуждает, бормочет себе :-) –