Я хочу вызвать переопределенный метод 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
. Когда я пытаюсь выполнить явное приведение типа , трактуйте (себя как тест).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 (без сериализации / десериализации)?
И ... после вызова процедуры, как можно отразить любые измененные атрибуты (а именно 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;
/