Как вызвать супер-метод объекта Oracle PL / SQL

Я хочу вызвать переопределенный метод 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;
/
6
задан HAL 9000 24 February 2012 в 08:58
поделиться