Reflexion in PLSQL?
Ich Schreibe eine Prozedur zum Umgang mit benutzerdefinierten Objekt, das gespeichert ist in ANYDATA. Der Objekt-Typ und Attribut-Namen können erst zur Laufzeit, also kann ich nicht definieren, das viarable, für die es im declare-Abschnitt. In Java kann ich mit Reflexion zu beschäftigen, kann ich wissen, den Namen der Klasse und die Felder für name. Dann kann ich den Zugriff auf die Felder durch Reflexion. Gibt es eine Möglichkeit, es zu tun in PLSQL-wie das? Was in meinem Kopf gerade jetzt ist die Schaffung einer sql-string in der Prozedur dynamisch, und führen Sie es aus. Aber es ist nicht das, was ich will, genau.
Angenommen, Benutzer A definiert ein ADT geben Sie als create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
und erstellen Sie eine Objekt-Instanz und fügen Sie ihn in ANYDATA.
In meinem Verfahren, irgendwie ich weiß, ich benötigen, um mit dem ersten Attribut dieses Objekts, die fname. Also, wenn wissen, das adt-type auf den ersten Platz, mein code wird so sein:
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 tun, damit es dynamisch? Vielen Dank im Voraus.
- Wenn Sie wissen, dass die
tempAnydata
ist wirklich einA.person_type
wie Sie sicherlich tun (sonst könnten Sie nicht tun, dieGetObject(adobject)
mit adobject von genau dieser Art), dann sollte man auch wissen, was in dieser Art das erste Attribut ist. Oder bin ich etwas fehlt? - A. person_type ist nur ein Beispiel, es könnte einer benutzerdefinierten Typ an. Es könnte sein, B. anymal_type oder etwas anderes.
- Statische starke Typisierung saugt. (grumpy old Smalltalker wandert aus und murmelte zu sich selbst 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
ANYTYPE
zu beschreiben, dieANYDATA
und sorgen dafür das der Typ korrekt ist. Dann können Sie den Zugriff auf die attribute überpiecewise
undgetVarchar2
.Meisten der code ist für die überprüfung der Art, die Sie nicht benötigen, wenn Sie nicht besorgt über Art Sicherheit.
Funktion Rückgabewert:
Typen:
Testlauf:
Ausgänge:
anydata.convertobject(self).gettypename()
(oder ersetzenself
mit dem Namen eine Art Instanz, wenn Sie von außen betrachtet, z.B.adobject
in OP ' s Beispiel).