Como chamar um super método de objeto Oracle PL / SQL
Eu gostaria de chamar um método PL / SQL substituído. Aqui está um exemplo:
-- 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)
)
/
gora, eu quero invocar a versão herdada doproc
método. Quando tento fazer um elenco explícito comotreat(self as test).proc(s);
não será compilado por causa de PLS-00363: a expressão 'SYS_TREAT' não pode ser utilizada como destino de atribuição
O corpo do tipo é compilado quando uso uma variável 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;
/
Mas quando executo o meu exemplo como este
declare
obj test2;
begin
obj := test2(0);
obj.proc('1');
end;
... lança ORA-21780: Número máximo de durações de objetos excedid
Existe alguma maneira de chamar test :: proc (sem serializar / desserializar
E ... depois que proc foi chamado, como pode qualquer atributo alterado (ou seja,n
) seja refletido emobj
?
Atualiza (Obrigado, tbone):
Alterei a organização dos meus métodos usando métodos de modelo ('before' e 'after'). Eu os adiciono sempre que preciso estender um 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;
/