Коллекции Oracle "pl / sql" присваиваются по значению или по ссылке? - PullRequest
1 голос
/ 25 марта 2019

У меня есть одна коллекция, и мне нужно скопировать эту коллекцию в другую.

Например:

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 Ответ

4 голосов
/ 25 марта 2019

Назначение в вашем примере 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 , они будут переданы по ссылке.

Подробнее об этом можно прочитать здесь Режимы параметров подпрограммы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...