【问题标题】:Is there a way to bulk copy the contents of one PL/SQL array variable into another?有没有办法将一个 PL/SQL 数组变量的内容批量复制到另一个?
【发布时间】:2013-09-09 22:17:27
【问题描述】:

假设我的包中有 2 个相同类型的表变量。请注意,这些类型是包本地的。

TYPE MyTableType is table of some_table%ROWTYPE;
table1 MyTableType;
table2 MyTableType;

我在包中有一个程序,它将一些数据加载到表 1 和表 2 中。在这样做之后的某个时候,我想将当前在 table1 中的所有内容添加到 table2 中。

有没有比循环 table1 和 .extend-ing table2,然后在每次迭代中设置 .last 元素的值更好的方法?

如果存在的话,我正在寻找某种快速的批量操作。是吗?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:
    22:02:22 SYSTEM@dwal> ed
    Wrote file S:\spool\dwal\BUFFER_SYSTEM_386.sql
    
      1   declare
      2     type t is table of dual%rowtype;
      3     c1 t := t();
      4     c2 t := t();
      5   begin
      6     c1.extend;
      7     c1(1).dummy := 'a';
      8     c2.extend(2);
      9     c2(1).dummy := 'b';
     10     c2(2).dummy := 'c';
     11     c2 := c1 multiset union all c2;
     12     for i in c2.first .. c2.last loop
     13       dbms_output.put_line(c2(i).dummy);
     14     end loop;
     15*  end;
    22:02:41 SYSTEM@dwal> /
    a
    b
    c
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:00.26
    

    upd:我从来没有机会对多集操作进行基准测试,aaaaaand,尽管它们看起来很庞大,但实际上速度更慢:

    22:14:56 SYSTEM@dwal> ed
    Wrote file S:\spool\dwal\BUFFER_SYSTEM_331.sql
    
      1  declare
      2    cnt int := 1e5;
      3    type t is table of dual%rowtype;
      4    c1 t := t();
      5    c2 t := t();
      6    timer int;
      7    procedure prebuild as
      8    begin
      9      c1.delete;
     10      c2.delete;
     11      c1.extend(cnt);
     12      c2.extend(cnt);
     13      for i in 1 .. cnt loop
     14        c1(i).dummy := dbms_random.string('l', 1);
     15        c2(i).dummy := dbms_random.string('l', 1);
     16      end loop;
     17    end;
     18  begin
     19    -- 1
     20    prebuild;
     21    timer := dbms_utility.get_cpu_time;
     22    for i in 1 .. cnt loop
     23      c2.extend;
     24      c2(c2.last) := c1(i);
     25    end loop;
     26    dbms_output.put_line(dbms_utility.get_cpu_time - timer);
     27    -- 2
     28    prebuild;
     29    timer := dbms_utility.get_cpu_time;
     30    c2 := c2 multiset union all c1;
     31    dbms_output.put_line(dbms_utility.get_cpu_time - timer);
     32    -- 3
     33    prebuild;
     34    timer := dbms_utility.get_cpu_time;
     35    c2.extend(c1.count);
     36    for i in 1 .. cnt loop
     37      c2(c2.count - c1.count + i) := c1(i);
     38    end loop;
     39    dbms_output.put_line(dbms_utility.get_cpu_time - timer);
     40* end;
    22:15:00 SYSTEM@dwal> /
    15
    25
    10
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:03.38
    

    这些数字相当稳定。第三种方法,它只扩展第二个集合一次,然后附加到它,似乎是最快的一种。

    【讨论】:

    • 太棒了,谢谢!不知道MULTISET UNION 操作,但是您说方法3,单个.extend 那么迭代分配实际上更快吗?您能否显示所有 3 种情况的输出,以便我们查看速度快多少?
    • @TomTresansky 到最后,10 万个元素的集合只需百分之一秒
    • 啊,把那些误认为是行号。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多