So rufen Sie eine Oracle-PL/SQL-Objekt-super-Methode

Möchte ich Ihnen eine überschriebene PL/SQL-Methode. Hier ist ein Beispiel:

-- 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)
)
/

Nun möchte ich aufrufen, die geerbte version der proc Methode. Wenn ich versuche, einen expliziten cast wie treat(self as test).proc(s); es wird nicht kompilieren, da der PLS-00363: Ausdruck 'SYS_TREAT' kann nicht verwendet werden, da eine Zuordnung Ziel

Art Körper kompiliert, wenn ich eine lokale variable:

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;
/

Aber wenn ich mein Beispiel wie diese

declare
  obj test2;
begin
  obj := test2(0);
  obj.proc('1');
end;

...es wirft ORA-21780: Maximale Anzahl der Objekt-Dauer überschritten.

Gibt es eine Möglichkeit zu nennen-test::proc (ohne serialisieren/Deserialisieren)?

Und... nach proc aufgerufen wurde, wie können die Attribute geändert (nämlich n), der sich in obj ?


Update (Danke tbone):

Änderte ich die Organisation meiner Methoden unter Verwendung von template-Methoden ('vor' und 'nach'). Ich füge Sie, wenn ich verlängern müssen, eine Methode.

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;
/
  • von docs sieht aus wie BEHANDELN wird verwendet, um den Zugang Subtyp Methoden/Attribute, nicht super. Ich kann mich irren, aber siehe docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjbas.htm
  • ja, du hast Recht. Die docs sagen BEHANDELN, können nur auf den Subtyp. Aber wie soll ich die super-Klasse?
InformationsquelleAutor HAL 9000 | 2012-02-20
Schreibe einen Kommentar