如果我們將一個對象變量賦值給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