Я хотел бы вызвать переопределенный метод PL / SQL.Вот пример:
-- 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)
)
/
Теперь я хочу вызвать унаследованную версию метода proc
.Когда я пытаюсь выполнить явное приведение типа treat(self as test).proc(s);
, оно не скомпилируется из-за PLS-00363: выражение 'SYS_TREAT' не может использоваться в качестве цели назначения
Тело типа компилируетсякогда я использую локальную переменную:
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;
/
Но когда я запускаю свой пример, подобный этому
declare
obj test2;
begin
obj := test2(0);
obj.proc('1');
end;
... он выдает ORA-21780: максимальное количество длительностей объектаПревышено.
Есть ли способ вызвать test :: proc (без сериализации / десериализации)?
И ... после вызова proc, как могут быть изменены какие-либо атрибуты (а именно n
) будет отражено в obj
?
Обновление (Спасибо, tbone):
Я изменил организацию своих методов с помощью шаблонных методов('до и после').Я добавляю их всякий раз, когда мне нужно расширить метод.
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;
/