oracle - 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 文档中找不到任何参考资料。
解决方案
您的示例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 OUT或OUT参数按值传递。但是,如果您指定NOCOPY选项,它们将通过引用传递。
你可以在这里阅读更多关于它的子程序参数模式
推荐阅读
- excel - Excel VBA删除许多不同的行
- html - Angular 6-如何仅在用户输入特定值时才显示表单字段?
- asynchronous - OpenJ9 gc 日志是异步的吗?
- python-3.x - sklearn逻辑回归上的DataConversionWarning
- intellij-idea - 如何在运行时执行期间获取 Intellij 的根项目目录
- azure-webjobs - 独立的 Azure Web 作业无法连接到托管在 Azure VM 中的 SQL Server
- archive - 解压缩明显拆分的 .gz、.sit 或 .tar 存档
- spring-data-jpa - 如何测试 jpa 只读查询?
- azure-ad-b2c - Azure B2C - 在电子邮件 OTP 验证期间自动单击“发送验证码”
- php - 当对象调用从静态调用切换时,php-mysqli insert_id 返回 0 而不是最后一个 id