首页 > 解决方案 > Oracle“pl/sql”集合是按值分配还是按引用分配?

问题描述

我有一个集合,需要将这个复制到另一个。

例如:

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 文档中找不到任何参考资料。

标签: oracleplsql

解决方案


您的示例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;

如您所见, in 的值internal_table没有改变,这意味着我们有两个不同的集合。

现在,如果您在谈论test过程的输入参数,它可以通过引用或值传递,这取决于参数的模式

IN参数始终通过引用传递。
默认情况下, IN OUTOUT参数按值传递。但是,如果您指定NOCOPY选项,它们将通过引用传递。

你可以在这里阅读更多关于它的子程序参数模式


推荐阅读