#oracle #plsql
#Oracle #plsql
Вопрос:
У меня есть одна коллекция, и мне нужно скопировать ее в другую.
Например:
TYPE my_table_type IS TABLE OF some_object;
procedure test(p_table IN my_table_type) is
internal_table my_table_type;
begin
internal_table := p_table;
internal_table.extend;
....
end;
Это назначение по ссылке или по значению?
Это правильный способ копирования вложенных таблиц?
Я пробовал. Кажется, это работает нормально. Но я не смог найти ни одной ссылки в документации Oracle.
Комментарии:
1. Фактический параметр передается по ссылке, см. табл. 8-2
Ответ №1:
Назначение в вашем примере internal_table := p_table;
является назначением по значению.
Вот небольшой тест, чтобы показать, как это работает:
set serveroutput on
declare
TYPE my_table_type IS TABLE OF integer;
table_ my_table_type := new my_table_type();
internal_table my_table_type;
begin
table_.extend(1);
table_(1) := 123;
dbms_output.put_line(table_(1)); --output is 123
internal_table := table_;
dbms_output.put_line(internal_table(1)); --output is 123
table_(1) := 321;
dbms_output.put_line(table_(1)); --output is 321
dbms_output.put_line(internal_table(1)); --output is 123
end;
Как вы можете видеть, значение в internal_table
не изменилось, что означает, что у нас есть две разные коллекции.
Теперь, если вы говорите о входном параметре test
процедуры, он может быть передан либо по ссылке, либо по значению, что зависит от режима аргумента:
Параметры IN всегда передаются по ссылке.
Параметры IN OUT или OUT по умолчанию передаются по значению. Но, если вы укажете опцию NOCOPY, они будут передаваться по ссылке.
Подробнее об этом можно прочитать здесь Режимы параметров подпрограммы
Комментарии:
1.
IN
параметры передаются по ссылке, а не по значению.2. @WilliamRobertson, конечно. Обновлен ответ. Спасибо