Me gustaría llamar a un método PL/SQL reemplazado. He aquí un ejemplo:Cómo llamar a un super método de objeto PL/SQL de Oracle
-- super class
create or replace type test as object
(
n number,
member procedure proc(SELF in out nocopy test, s varchar2)
)
alter type test not final
/
create or replace type body test is
member procedure proc(SELF in out nocopy test, s varchar2) is
begin
dbms_output.put_line('test1: n='||nvl(self.n, 'null')||' s='||s);
self.n := to_number(s);
end;
end;
/
-- derived class
create or replace type test2 under test
(
overriding member procedure proc(SELF in out nocopy test2, s varchar2)
)
/
Ahora quiero invocar la versión heredada del método proc
. Cuando trato de hacer una conversión explícita como treat(self as test).proc(s);
que no se compilará debido PLS-00363: la expresión 'SYS_TREAT' no puede ser utilizado como un destino de la asignación
El cuerpo tipo compila cuando se utiliza una variable local:
create or replace type body test2 is
overriding member procedure proc(SELF in out nocopy test2, s varchar2) is
O test;
begin
O := treat(self as test);
O.proc(s);
end;
end;
/
Pero cuando corro mi ejemplo como este
declare
obj test2;
begin
obj := test2(0);
obj.proc('1');
end;
... que arroja ORA-21780: el número máximo de duración de objetos superó.
¿Hay alguna manera de invocar test :: proc (sin serialización/deserialización)?
Y ... después de que se haya llamado al proc, ¿cómo se puede reflejar algún atributo modificado (a saber, n
) en obj
?
actualización (Gracias, tbone):
me cambió la organización de mis métodos que utilizan métodos de plantilla ('antes' y 'después'). Los agrego cada vez que necesito extender un método.
create or replace type test as object
(
n number,
member procedure proc (SELF in out nocopy test, s varchar2),
member procedure afterProc (SELF in out nocopy test, s varchar2)
member procedure beforeProc(SELF in out nocopy test, s varchar2),
)
not final
/
create or replace type body test is
member procedure proc(SELF in out nocopy test, s varchar2) is
begin
beforeProc(s);
dbms_output.put_line('test1: n='||nvl(n, 'null')||' s='||s);
n := to_number(s);
afterProc(s);
end;
member procedure afterProc (SELF in out nocopy test, s varchar2) is begin null; end;
member procedure beforeProc(SELF in out nocopy test, s varchar2) is begin null; end;
end;
/
de docs parece que TREAT se usa para acceder a los métodos de subtipo/attribs, no súper. Puedo estar equivocado, pero vea http://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjbas.htm – tbone
sí, tiene razón. Los documentos dicen que TRATAR solo puede acceder al subtipo. ¿Pero cómo se supone que debo usar la súper clase? –