Geçersiz kılınan bir PL/SQL yöntemini çağırmak istiyorum. İşte bir örnek: Bir Oracle PL/SQL nesnesi süper yöntemi nasıl çağrılır
-- 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)
)
/
Şimdi
proc
yöntemin miras sürümünü çağırmak istiyorum. ifadesi 'SYS_TREAT' bir atama hedefi yerel bir değişken kullandığınızda tipi vücut derler
olarak kullanılamaz: Yapmam çalıştığınızda treat(self as test).proc(s);
gibi açık bir döküm bunun yüzünden PLS-00363 derlenmeyecektir
declare
obj test2;
begin
obj := test2(0);
obj.proc('1');
end;
gibi benim örnek çalıştırdığınızda
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;
/
Ama ... ORA-21780 atar: nesne süreleri üst sınırı aşıldı.
Test :: proc (serializing/deserializing olmadan) çağrısının herhangi bir yolu var mı?
Ve ... proc çağrıldıktan sonra, değiştirilen özellikler (n
) obj
'a nasıl yansıtılır?
Güncelleme (Teşekkürler, tbone):
I ('önce' ve 'sonra') şablonu yöntemlerle yöntemlerimden organizasyonunu değiştirdi. Bir yöntemi genişletmem gerektiğinde onları ekliyorum.
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;
/
görünüyor TREAT gibi alt türü yöntemleri/attribs erişmek için kullanılır, süper değil. Yanılıyor olabilirim, ancak http://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjbas.htm – tbone
evet, haklısınız. Doktorlar TREAT'in sadece alt sınıfa erişebileceğini söylüyor. Ama süper sınıfı nasıl kullanmalıyım? –