Ich schreibe eine Prozedur, um mit benutzerdefiniertem Objekt umzugehen, das in ANYDATA gespeichert wird. Der Objekttyp und der Attributname können nur zur Laufzeit bekannt sein, daher kann ich das Viable nicht im Deklarationsabschnitt definieren. In Java kann ich mit Reflektion umgehen, ich kann den Klassennamen und den Feldnamen kennen. Dann kann ich durch Reflexion auf die Felder zugreifen. Gibt es eine Möglichkeit, es in PLSQL so zu machen? Was in meinem Kopf gerade jetzt ist, erstellen Sie eine SQL-Zeichenfolge in der Prozedur dynamisch und führen Sie es aus. Aber genau das will ich nicht.Reflexion in PLSQL?
Angenommen, Benutzer A hat einen ADT-Typ wie create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
definiert und eine Objektinstanz erstellt und in ANYDATA eingefügt.
In meiner Prozedur weiß ich irgendwie, ich muss mit dem ersten Attribut dieses Objekts umgehen, das ist fname. Also, wenn die adt Art an erster Stelle wissen, wird mein Code wie:
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;
Also, was soll ich es dynamisch tun, um? Danke im Voraus.
Wenn Sie wissen, dass die 'tempAnydata' ist * wirklich * ein' A.person_type' wie Sie sicherlich tun (sonst könnte man die 'GetObject (ADObject nicht tun)' mit ADObject von genau dieser Art) dann weißt du * auch *, was das erste Attribut dieses Typs ist. Oder fehlt mir etwas? –
A.person_type ist nur ein Beispiel, es könnte ein beliebiger benutzerdefinierter Typ sein. Es könnte B.anymal_type oder etwas anderes sein. – icespace
Statische starke Typisierung saugt. (mürrisch alt Smalltalker wandert ab und murmelt zu sich selbst :-) –