我有对象 A 的对象 B 子对象。在对象 BI 中,我想从对象 A 调用一个方法。
看起来在 Oracle 11 中我们可以使用这个:
(SELF AS parent_object).parent_method
但我使用 Oracle 10,这不起作用。还有其他方法吗?
谢谢
PS:我想在 CONSTRUCTOR METHOD 中这样做(也许它会改变一些东西)
我有对象 A 的对象 B 子对象。在对象 BI 中,我想从对象 A 调用一个方法。
看起来在 Oracle 11 中我们可以使用这个:
(SELF AS parent_object).parent_method
但我使用 Oracle 10,这不起作用。还有其他方法吗?
谢谢
PS:我想在 CONSTRUCTOR METHOD 中这样做(也许它会改变一些东西)
你是对的,这个特性是在 11.1 中引入的,正如在 Object-Relational Features 中的新增功能中提到的那样?.
10g 手册也谈到了这个限制。最好的解决方法是创建一个静态超类型方法:
使用 PL/SQL 实现方法时,不能使用 super 关键字调用超类型对象方法或具有覆盖方法的派生对象中的等效方法。但是,您可以调用静态超类型方法作为解决方法。有关超类型和子类型函数的定义,请参见“使用覆盖方法创建子类型”中的示例。
非常小心(这意味着,无论您将采取什么措施来预防问题,将来您身体的不同部位都会受到很多痛苦),您可以将子类型转换为父类型并调用其方法。
需要格外小心,因为当然,您将丢失通过调用此方法对成员字段所做的任何更改。因此,您只能将这种方式用于不更改类型成员字段的基本方法。
create type type_1 as object (
field1 number(1)
,member procedure init
) not final;
/
create or replace type body type_1 as
member procedure init as
begin
field1 := 0;
dbms_output.put_line('init works! Field1 = ' || field1);
end;
end;
/
create type type_2
under type_1 (
field2 number(1)
,constructor function type_2(self in out type_2, arg number) return self as result
);
/
create or replace type body type_2 as
constructor function type_2(self in out type_2, arg number) return self as result as
parent type_1;
begin
self.field2 := arg;
self.field1 := -1;
select self
into parent
from dual;
parent.init();
dbms_output.put_line('Child''s field1 = ' || self.field1);
return;
end;
end;
/
declare
child type_2 := type_2(2);
begin
return;
end;
/