我有一个pckage plch_pkg如下
create type plch_number_nt is table of number;
create or replace package plch_pkg
authid definer
is
g_numbers plch_numbers_nt:=plch_numbers_nt(1);
procedure empty_the_nt_fail(numbers_io IN OUT plch_numbers_nt);
procedure empty_the_nt(numbers_io IN OUT plch_numbers_nt);
end plch_pkg;
create or replace package body plch_pkg
is
procedure empty_the_nt_fail(numbers_io in out plch_numbers_nt)
is
begin
dbms_output.put_line('empty_the_nt_fail');
numbers_io.delete;
raise program_error;
end empty_the_nt_fail;
procedure empty_the_nt(numbers_io in out plch_numbers_nt)
is
begin
dbms_output.put_line('empty_the_nt');
numbers_io.delete;
end empty_the_nt;
end plch_pkg;
后来我创建了这个程序。
create or replace procedure plch_proc
authid definer
is
l_numbers plch_numbers_nt := plch_numbers_nt(1);
procedure show_numbers
is
begin
dbms_output.put_line('count='||l_numbers.count);
end;
begin
plch_pkg.empty_the_nt_fail(l_numbers);
show_numbers;
exception
when others then
show_numbers;
end plch_proc;
现在我按照以下方式调用此程序
declare
begin
plch_proc;
end;
我得到输出为count = 0。 这是我的理解。我的程序plch_proc plch_pkg中的empty_the_nt_fail过程。删除numbers_io嵌套表中的所有元素后,会引发错误。 oracle文档说“只有当过程完成且没有异常时,结果值才会被复制回形式参数”。 将number_io复制到我的实际参数l_numbers时不应该发生错误。但是当我调用过程plch_proc时,它将计数打印为0,这意味着形式参数值被复制到实际参数。有人可以解释一下
我在这里找到了复制实际参数和形式参数的解释 https://docs.oracle.com/cd/B10500_01/appdev.920/a96624/08_subs.htm#895
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/08_subs.htm#i23202
http://www.dba-oracle.com/t_pl_sql_nocopy_data_structures.htm