加入收藏 | 设为首页 | 会员中心 | 我要投稿 孝感站长网 (https://www.0712zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – 有没有办法将一个PL / SQL数组变量的内容批量复制到另

发布时间:2021-02-22 03:13:34 所属栏目:站长百科 来源:网络整理
导读:假设我的包中有2个相同类型的表变量.请注意,这些类型是包的本地类型. TYPE MyTableType is table of some_table%ROWTYPE;table1 MyTableType;table2 MyTableType; 我在程序包中有一个过程,它将一些数据加载到table1和table2中.在这之后的某个时刻,我想将tabl

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

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

我在程序包中有一个过程,它将一些数据加载到table1和table2中.在这之后的某个时刻,我想将table1中当前的所有内容添加到table2中.

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

我正在寻找某种快速的批量操作,如果它存在的话.可以?

解决方法

22:02:22 SYSTEM@dwal> ed
Wrote file S:spooldwalBUFFER_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:我从来没有机会对multiset操作进行基准测试,aaaaaand,尽管它们看起来很大,但实际上它们似乎更慢:

22:14:56 SYSTEM@dwal> ed
Wrote file S:spooldwalBUFFER_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

这些数字相当稳定.第三种方法,只延伸第二次收集,然后附加到它,似乎是最快的方法.

(编辑:孝感站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读