将值复制到实际参数

时间:2015-10-11 10:34:25

标签: sql oracle plsql

我有一个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

0 个答案:

没有答案