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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zugriff auf die super-Methoden, versucht wird, entweder die Allgemeine Anrufung oder generalisierte Ausdruck. Zum Beispiel mit einer person Supertyp und Schüler Subtyp:
EDIT:
Wenn Sie auf 10g, die Sie brauchen zu organisieren, die funktioniert ein wenig anders, aber die gleiche Funktionalität vom Kind zum Aufruf der super-Methode:
Nun würde man show_super() von Studenten-für-die-person-Methode, oder einfach nur show() für die student-Methode.
Aus der docs, hoffe, das hilft.