【发布时间】:2014-10-30 11:30:48
【问题描述】:
如果我们在 pl/sql 中将一个对象变量分配给其他对象变量,则该对象被克隆,因为 pl/sql 不能使用引用。比如下面的代码会打印出两个不同的句子:
create or replace type cla as object -- class (would be very complex)
(
name varchar2(50)
);
declare
o1 cla;
o2 cla;
begin
o1 := cla('hi cloning world');
o2 := o1;
o1.name = 'goodbye cloning world';
dbms_output.put_line('o1.name: ' || o1.name);
dbms_output.put_line('o2.name: ' || o2.name);
end;
所以我想我可以将对象封装到其他对象(外部对象)中,如果我将外部对象分配给其他外部对象,那么内部对象就不会被克隆:
create or replace type cla as object -- class (would be very complex)
(
name varchar2(10)
);
create or replace type eo_c as object -- class to encapsulate objects
(
o cla -- encapsulation is easy
);
declare
eo eo_c;
eo2 eo_c;
begin
eo := eo_c( cla('n1') ); -- eo is easy to create
dbms_output.put_line('eo.name: ' || eo.o.name); -- real object is easy to access
eo2 := eo; -- eo_c object is cloned, cla object shouldn't be cloned
eo.o.name := 'n2'; -- if eo.o == eo2.o then we are changing both names
dbms_output.put_line('eo.name: ' || eo.o.name);
dbms_output.put_line('eo2 name: ' || eo2.o.name);
end;
但这又打印了两个不同的句子,所以内部对象也被克隆了。
我可以将对象封装到其他类型的变量中以避免克隆内部对象吗?或者更一般地说,是否有一些技巧可以避免对象的克隆,同时提供一种简单的方法来使用它?
【问题讨论】:
-
不确定您是否可以在 PL/SQL 上下文中使用
ref避免 PLS-00536,您在第一句话中就暗示了这一点。你为什么要将同一个对象分配给两个变量呢?我猜你可以有一个关联的对象数组,并让你的变量保存这些对象的索引,但这种重定向可能会很痛苦。 -
为了方便oo编程,需要引用copy。例如,如果您通过将一些其他对象传递给构造函数来创建对象,“o_c1 := c1(o_c2, o_c3);”,那么 o_c2 和 o_c3 可以作为属性存储到 o_c1 中,它们应该是相同的对象您在 o_c1 中使用(和更改)的对象,而不是它们的克隆。强大的 oo 编程需要对象引用。