如果我们将一个对象变量赋值给pl/sql中的其他对象变量,则该对象将被克隆,因为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;
但是,再次打印两个不同的句子,所以内部对象也被克隆了。
我可以将对象封装到其他类型的变量中以避免克隆内部对象吗?或者更一般地说,是否有一些技巧可以避免克隆对象,同时允许使用它的简单方法?
不知道你能避免PLS-00536与'ref'在PL/SQL上下文中,您在第一句中暗示了这一点。为什么你想分配相同的对象到两个变量?我想你可以有一个关联的对象数组,并让你的变量将索引保存到那些对象中,但是重定向可能会很痛苦。 – 2014-09-05 15:33:12
为了便于编程,需要参考副本。例如,如果通过将其他对象传递给构造函数“o_c1:= c1(o_c2,o_c3);”来创建对象,则o_c2和o_c3可以作为属性存储到o_c1中,并且它们应该与您正在使用(和更改)o_c1的对象,而不是它们的克隆。强大的oo编程需要对象引用。 – freesoft 2014-09-08 06:51:32