Как получить указатель на объект?
От: ZiC  
Дата: 17.07.09 09:04
Оценка:
Пытался создать дерево на pl/sql (Oracle), но возникла такая трудность: при присваивании одного объекта другому он похоже присваивает не ссылку на объект, а создает копию первого. Таким образом получается, что каждый элемент дерева вместо ссылки на родителя содержит в себе другого идентичного родителя с идентичным деревом, что сильно замедляет процесс и съедает много памяти.
Для наглядности, пусть имеем тип:

CREATE OR REPLACE TYPE t_test AS OBJECT
(
id NUMBER
);



Тогда следующий код:

DECLARE
t1 t_test;
t2 t_test;
BEGIN
t1 := new t_test(1);
t2 := t1;
out(t1.id || t2.id);
t2.id := 2;
out(t1.id || t2.id);
END;



выдает:

11
12



Может кто-нибудь знает, как переменной t2 присвоить указатель на t1, чтобы при изменении t2 менялись также параметры t1?
Re: Как получить указатель на объект?
От: niteshade123  
Дата: 17.07.09 10:06
Оценка:
Здравствуйте, ZiC, Вы писали:

<code>
create or replace procedure test_(p in out nocopy t_test) is
begin
dbms_output.put_line(p.id);
if p.id = 1 then
p.id := 2;
test_(p);
end if;
end test_;
</code>

<code>
declare
v_p t_test := new t_test(1);
begin
test_(v_p);
dbms_output.put_line(v_p.id);
end;
</code>
Re: Как получить указатель на объект?
От: Овощ http://www.google.com
Дата: 17.07.09 10:14
Оценка:
Можно посмотреть в эту сторону: Sharing Objects through the REF Modifier и Рекурсивный тип. Как сделать?.
Re[2]: Как получить указатель на объект?
От: ZiC  
Дата: 22.07.09 02:19
Оценка:
Это не совсем то, что нужно. Условно говоря мне необходимо решить задачу — получить две переменные, указывающие на одну область памяти. Если использовать функцию с параметром IN OUT NOCOPY то ссылка будет передаваться в функцию, но при присвоении такого параметра другой переменной опять произойдет копирование объекта.
Re[2]: Как получить указатель на объект?
От: ZiC  
Дата: 22.07.09 02:21
Оценка:
Если я правильно понял, то REF может указывать только на объект, находящийся в таблице, так как такой указатель содержит в себе название таблицы и идентфикатор строки в ней, соответствующей объекту. Указатель на переменную через REF получить нельзя, а значит и в создании дерева использовать его не получится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.