Estoy escribiendo un procedimiento para tratar con el objeto definido por el usuario que se almacena en ANYDATA. El tipo de objeto y el nombre del atributo solo pueden conocerse en tiempo de ejecución, por lo que no puedo definir el elemento viable en la sección de declaración. En Java, puedo usar la reflexión para manejarlo, puedo conocer el nombre de la clase y el nombre de los campos. Entonces puedo acceder a los campos a través de la reflexión. ¿Hay alguna forma de hacerlo en PLSQL así? Lo que en mi cabeza ahora es crear una cadena sql en el procedimiento de forma dinámica y ejecutarlo. Pero no es lo que quiero exactamente.Reflexión en PLSQL?
Digamos que el usuario A definió un tipo de ADT como create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
y crea una instancia de objeto e inserta en ANYDATA.
En mi procedimiento, de alguna manera sé que tengo que tratar con el primer atributo de este objeto, que es fname. Así que si conocer el tipo de ADT en el primer lugar, el código será como:
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;
Entonces, ¿qué debería hacer para que sea de forma dinámica? Gracias por adelantado.
Si sabe que el 'tempAnydata' es realmente * * un' A.person_type' como seguramente lo hace (de lo contrario no podría hacer el 'GetObject (adobject)' con adobject exactamente de este tipo) entonces * también * sabe cuál es el primer atributo de ese tipo. ¿O me estoy perdiendo algo? –
A.person_type es solo un ejemplo, podría ser cualquier tipo definido por el usuario. Puede ser B.anymal_type o algo más. – icespace
Succión fuerte estática es una mierda (El viejo y malhumorado Smalltalker se aleja, murmurando para sí mismo :-) –