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