Sto scrivendo una procedura per gestire l'oggetto definito dall'utente che è archiviato in ANYDATA. Il tipo di oggetto e il nome dell'attributo possono essere conosciuti solo in fase di esecuzione, quindi non posso definirne la viabile nella sezione declare. In Java, posso usare il reflection per affrontarlo, posso sapere il nome della classe e il nome del campo. Quindi posso accedere ai campi attraverso la riflessione. C'è un modo per farlo in PLSQL come quello? Ciò che nella mia testa in questo momento sta creando una stringa SQL nella procedura in modo dinamico ed eseguirla. Ma non è quello che voglio esattamente.Riflessione in PLSQL?
Diciamo che l'utente A ha definito un tipo di ADT come create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
e crea un'istanza di oggetto e lo inserisce in ANYDATA.
Nella mia procedura, in qualche modo so che devo occuparmi del primo attributo di questo oggetto, che è fname. Quindi, se conoscere il tipo ADT al primo posto, il mio codice sarà come:
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;
Quindi cosa devo fare per fare in modo dinamico? Grazie in anticipo.
Se si sa che il 'tempAnydata' è * veramente * un' A.person_type' come sicuramente fare (altrimenti non si poteva fare il GetObject (adobject ')' con adobject di esattamente questo tipo) quindi * anche * sai qual è il primo attributo di quel tipo. O mi sta sfuggendo qualcosa? –
A.person_type è solo un esempio, potrebbe essere qualsiasi tipo definito dall'utente. Potrebbe essere B.anymal_type o qualcos'altro. – icespace
La tipizzazione forte statica fa schifo. (Scontrosa vecchia Smalltalker vaga, borbottando :-) –