ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle开发 » for v in ( *****) loop shape 问题

标题: for v in ( *****) loop shape 问题
在线/呼叫 jvkojvko
小马哥


精华贴数 1
个人空间 0
技术积分 5598 (236)
社区积分 44498 (17)
注册日期 2007-9-10
论坛徽章:20
祖母绿萤石祖母绿紫水晶紫水晶红宝石
海蓝宝石紫水晶蓝锆石月度论坛发贴之星金色在线徽章 

发表于 2008-6-30 16:17 
学习了


__________________
马无夜草不肥,人无外财不富。

-------------------------------
长期高价出售奥运章
只看该作者    顶部
离线 caizhuoyi
Oracle Stranger


精华贴数 2
个人空间 0
技术积分 1524 (1102)
社区积分 448 (1495)
注册日期 2006-3-1
论坛徽章:4
授权会员生肖徽章2007版:龙2008北京奥运纪念徽章:棒球数据库板块每日发贴之星  
      

发表于 2008-6-30 16:40 
回复 #7 ekunge 的帖子

举个例子吧,成批绑定forall不能用于记录,
可以用bulk collect,其专门用来将数据批量绑定到一个集合。
DECLARE
  TYPE t_ind_by IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
  v_ind_by t_ind_by;
BEGIN

  SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno BULK COLLECT
    INTO v_ind_by
    FROM emp;

  FOR j IN v_ind_by.FIRST .. v_ind_by.LAST LOOP  --这里也不能用forall,不支持记录。
    INSERT INTO demo_g
    VALUES
      (v_ind_by(j).empno,
       v_ind_by(j).ename,
       v_ind_by(j).job,
       v_ind_by(j).mgr,
       v_ind_by(j).hiredate,
       v_ind_by(j).sal,
       v_ind_by(j).comm,
       v_ind_by(j).deptno);
  END LOOP;
END;


__________________
我不在江湖,但江湖中有我的传说;
我身在江湖,江湖里却没有我的传说。
只看该作者    顶部
离线 mychary
高级会员



来自 合肥
精华贴数 0
个人空间 0
技术积分 6908 (183)
社区积分 160 (2659)
注册日期 2003-9-18
论坛徽章:9
ITPUB元老会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:花样游泳
数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星   

发表于 2008-6-30 16:41 
SQL> create table demo as select * from emp where 1=2;

表已创建。


SQL> declare
  2       type newtype   is table of  emp%rowtype  INDEX BY BINARY_INTEGER;
  3       shape newtype;
  4       i number;
  5       j number;
  6       begin
  7             dbms_output.put_line('beginforall:'||to_char(sysdate,'yyyy hh24:mi:ss'));
  8              for v in (select rownum,t.* from emp t where rownum<4) loop
  9              shape(v.rownum).ename:=v.ename;
10              shape(v.rownum).empno :=v.empno;
11             end loop;
12  
13      for j in 1 .. 3 loop
14       insert into demo(empno,ename) values(shape(j).empno,shape(j).ename);
15     end loop;
16         dbms_output.put_line('endforall'||to_char(sysdate,'yyyy hh24:mi:ss'));
17      end;
18  /
beginforall:2008 16:39:54
endforall2008 16:39:54

PL/SQL 过程已成功完成。

SQL> select * from demo;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM
---------- ---------- --------- ---------- ---------- ---------- ----------
    DEPTNO
----------
      7369 SMITH


      7499 ALLEN


      7521 WARD



SQL>


只看该作者    顶部
离线 ekunge
中级会员



精华贴数 0
个人空间 0
技术积分 533 (3620)
社区积分 0 (415287)
注册日期 2005-5-19
论坛徽章:0
      
      

发表于 2008-6-30 17:11 
[quote]原帖由 mychary 于 2008-6-30 16:41 发表
SQL> create table demo as select * from emp where 1=2;

表已创建。


SQL> declare
  2       type newtype   is table of  emp%rowtype  INDEX BY BINARY_INTEGER;
  3       shape newtype;
  4       i number;
  5       j number;
  6       begin
  7             dbms_output.put_line('beginforall:'||to_char(sysdate,'yyyy hh24:mi:ss'));
  8              for v in (select rownum,t.* from emp t where rownum<4) loop
  9              shape(v.rownum).ename:=v.ename;
10              shape(v.rownum).empno :=v.empno;
11             end loop;
12  
13      for j in 1 .. 3 loop
14       insert into demo(empno,ename) values(shape(j).empno,shape(j).ename);
15     end loop;
16         dbms_output.put_line('endforall'||to_char(sysdate,'yyyy hh24:mi:ss'));
17      end;

这个虽然能实现,不过效率和

declare
         type newtype   is table of  emp%rowtype  INDEX BY BINARY_INTEGER;
         shape newtype;
         i number;
         j number;
         begin
               dbms_output.put_line('beginforall:'||to_char(sysdate,'yyyy hh24:mi:ss'));
                for v in (select rownum,t.* from emp t where rownum<4) loop
                  insert into demo(empno,ename) values(v.empno,v.ename);
             end loop;
         dbms_output.put_line('endforall'||to_char(sysdate,'yyyy hh24:mi:ss'));
      end;
就没区别了,我自己测试了一下,
插入2万条记录,4个字段,这2段方式都是消耗2秒钟,并没有我最初的例子里面的shape的效率优势。
如果是1个字段的话,插入4万条记录,用shape就只要1秒种,明显比另一个快。


__________________
看贴长见识发贴求真知
只看该作者    顶部
离线 ekunge
中级会员



精华贴数 0
个人空间 0
技术积分 533 (3620)
社区积分 0 (415287)
注册日期 2005-5-19
论坛徽章:0
      
      

发表于 2008-6-30 17:19 


QUOTE:
原帖由 caizhuoyi 于 2008-6-30 16:40 发表
举个例子吧,成批绑定forall不能用于记录,
可以用bulk collect,其专门用来将数据批量绑定到一个集合。
DECLARE
  TYPE t_ind_by IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
  v_ind_by t_ind_by;
BEGIN

  SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno BULK COLLECT
    INTO v_ind_by
    FROM emp;

  FOR j IN v_ind_by.FIRST .. v_ind_by.LAST LOOP  --这里也不能用forall,不支持记录。
    INSERT INTO demo_g
    VALUES
      (v_ind_by(j).empno,
       v_ind_by(j).ename,
       v_ind_by(j).job,
       v_ind_by(j).mgr,
       v_ind_by(j).hiredate,
       v_ind_by(j).sal,
       v_ind_by(j).comm,
       v_ind_by(j).deptno);
  END LOOP;
END;

这样做好像并不比
for v in (select * from emp) loop
             insert into demo
             values(v.last_name);
         end loop;
这个方式快吧?
至少我用2万条记录,4个字段测试是一样的时间。
会不会是记录少了看不出效果?


__________________
看贴长见识发贴求真知
只看该作者    顶部
离线 caizhuoyi
Oracle Stranger


精华贴数 2
个人空间 0
技术积分 1524 (1102)
社区积分 448 (1495)
注册日期 2006-3-1
论坛徽章:4
授权会员生肖徽章2007版:龙2008北京奥运纪念徽章:棒球数据库板块每日发贴之星  
      

发表于 2008-6-30 17:31 
回复 #15 ekunge 的帖子

对,数据量越大bulk collect的优势越明显。


__________________
我不在江湖,但江湖中有我的传说;
我身在江湖,江湖里却没有我的传说。
只看该作者    顶部
离线 ekunge
中级会员



精华贴数 0
个人空间 0
技术积分 533 (3620)
社区积分 0 (415287)
注册日期 2005-5-19
论坛徽章:0
      
      

发表于 2008-6-30 17:40 
回复 #16 caizhuoyi 的帖子

非常感谢。


__________________
看贴长见识发贴求真知
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问