北京oracle培训_oracle培训哪家好_CUUG官方论坛_CUUG培训怎么样_CUUG官网

 找回密码
 立即注册
查看: 12246|回复: 9

导数据问题

[复制链接]
发表于 2013-4-15 16:31:36 | 显示全部楼层 |阅读模式
有两个表 vac_user_test 和 cbd.temp_user_test,两个表表结构不同,cbd.temp_user_test 中有 10W 条数据,vac_user_test 无数据
现在想把 cbd.temp_user_test 中的数据按照对应规则导入到 vac_user_test 中
写了个存储过程,执行时间是 50s
使用语句执行时间是 9s
想知道如何优化存储过程
如果cbd.temp_user_test中的数据扩展到 2000W,那个执行效率高?

表结构如下:
SQL> desc vac_user_test
Name                                                                                Null?    Type
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
MDN                                                                                 NOT NULL VARCHAR2(30)
IMSI                                                                                         VARCHAR2(50)
USERTYPE                                                                            NOT NULL VARCHAR2(2)
USERSTAT                                                                            NOT NULL VARCHAR2(2)
USERBRAND                                                                                    VARCHAR2(5)
USERSCPTYPE                                                                                  VARCHAR2(1)
USERPREPAIDID                                                                                VARCHAR2(20)
UPDATEDATE                                                                          NOT NULL VARCHAR2(14)
CREATEBY                                                                                     NUMBER(1)
CREATETIME                                                                                   DATE
UPDATETIME                                                                                   DATE
LASTUPDATETYPE                                                                               NUMBER(1)
USERSERVICETYPE                                                                              NUMBER(1)
IFSENT                                                                                       NUMBER(1)




SQL> desc cbd.temp_user_test
Name                                                                                Null?    Type
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
USER_NUMBER                                                                         NOT NULL VARCHAR2(30)
NETWORK_TYPE                                                                        NOT NULL NUMBER(2)
REGISTER_DATE                                                                                DATE
PAYMENT_TYPE                                                                        NOT NULL NUMBER(2)
STATUS                                                                              NOT NULL NUMBER(2)
IMSI                                                                                         VARCHAR2(30)
BRAND                                                                                        VARCHAR2(50)
UPDATE_DATE                                                                              DATE
SCP_TYPE                                                                                     NUMBER(2)
PREPAID_ID                                                                                   VARCHAR2(30)

存储过程如下:
  1. CREATE OR REPLACE PROCEDURE INSERTUSER(resultCode out number,message out varchar2)
  2. IS
  3. exec_time varchar2(14);
  4. sqlstr varchar2(2000);

  5. TYPE CURSOR_TYPE IS REF CURSOR;
  6. cur_user CURSOR_TYPE;

  7. TYPE U_TYPE IS RECORD(
  8. v_mdn cbd.temp_user_test.user_number%TYPE,
  9. v_imsi cbd.temp_user_test.imsi%TYPE,
  10. v_payment_type cbd.temp_user_test.payment_type%TYPE,
  11. v_status cbd.temp_user_test.status%TYPE,
  12. v_brand cbd.temp_user_test.brand%TYPE,
  13. v_scp_type cbd.temp_user_test.scp_type%TYPE,
  14. v_prepaid_id cbd.temp_user_test.prepaid_id%TYPE,
  15. v_update_date cbd.temp_user_test.update_date%TYPE,
  16. v_register_date cbd.temp_user_test.register_date%TYPE,
  17. v_network_type cbd.temp_user_test.network_type%TYPE);

  18. user_row U_TYPE;


  19. BEGIN
  20. --- programe exec starttime
  21. SELECT to_char(sysdate,'MM-DD HH24:MI:SS') INTO exec_time FROM dual;
  22. DBMS_OUTPUT.put_line('start : '||exec_time);
  23. resultCode := 0;
  24. message := 'success';

  25. BEGIN
  26. sqlstr := 'SELECT u.user_number,u.imsi,u.payment_type,';
  27. sqlstr := sqlstr || 'decode(u.status,0,10,1,11,2,14,3,30),u.brand,u.scp_type,u.prepaid_id,';
  28. sqlstr := sqlstr || 'u.update_date,u.register_date,decode(u.network_type,0,0,8,1,2,2,3,3,4,4,1,5,7,6,6,7,5,8,9) ';
  29. sqlstr := sqlstr || ' FROM cbd.temp_user_test u';
  30. sqlstr := sqlstr || '';

  31. OPEN cur_user FOR sqlstr;

  32. LOOP
  33. FETCH cur_user INTO user_row;
  34. EXIT WHEN cur_user%NOTFOUND;

  35. sqlstr := 'insert into vac_user_test(MDN,IMSI,USERTYPE,USERSTAT,USERBRAND,USERSCPTYPE,USERPREPAIDID,';
  36. sqlstr := sqlstr || 'UPDATEDATE,CREATEBY,CREATETIME,UPDATETIME,LASTUPDATETYPE,USERSERVICETYPE,IFSENT)';
  37. sqlstr := sqlstr || 'values (:MDN,:IMSI,:USERTYPE,:USERSTAT,:USERBRAND,:USERSCPTYPE,:USERPREPAIDID,';
  38. sqlstr := sqlstr || ':UPDATEDATE,3,:CREATETIME,:UPDATETIME,1,:USERSERVICETYPE,1)';

  39. execute immediate sqlstr using user_row.v_mdn,user_row.v_imsi,user_row.v_payment_type,
  40. user_row.v_status,user_row.v_brand,user_row.v_scp_type,user_row.v_prepaid_id,
  41. nvl(to_char(user_row.v_update_date,'YYYYMMDDHH24MISS'),to_char(user_row.v_register_date,'YYYYMMDDHH24MISS')),
  42. user_row.v_register_date,user_row.v_update_date,user_row.v_network_type;

  43. END LOOP;

  44. COMMIT;
  45. CLOSE cur_user;
  46. END;

  47. --- programe exec endtime
  48. SELECT to_char(sysdate,'MM-DD HH24:MI:SS') INTO exec_time FROM dual;
  49. DBMS_OUTPUT.put_line('end : '||exec_time);

  50. END INSERTUSER;
  51. /
复制代码
执行的 sql 语句如下:
  1. insert into vac_user_test(MDN,IMSI,USERTYPE,USERSTAT,USERBRAND,USERSCPTYPE,USERPREPAIDID,
  2. UPDATEDATE,CREATEBY,CREATETIME,UPDATETIME,
  3. LASTUPDATETYPE,USERSERVICETYPE,IFSENT)
  4. select u.user_number,u.imsi,u.payment_type,decode(u.status,0,10,1,11,2,14,3,30),u.brand,u.scp_type,u.prepaid_id,
  5. nvl(to_char(u.update_date,'YYYYMMDDHH24MISS'),to_char(u.register_date,'YYYYMMDDHH24MISS')),3,u.register_date,u.update_date,
  6. 1,decode(u.network_type,0,0,8,1,2,2,3,3,4,4,1,5,7,6,6,7,5,8,9),1
  7. from cbd.temp_user_test u;
复制代码
请各位老师和同学帮我看看是哪的问题?


















回复

使用道具 举报

发表于 2013-4-16 06:36:33 | 显示全部楼层
建议用SQL来完成。PL/SQL最应该避免的就是你这种操作,循环倒数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-16 09:06:34 | 显示全部楼层
OK,谢谢老师
回复 支持 反对

使用道具 举报

飞跃爱 该用户已被删除
发表于 2014-8-19 07:36:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|CUUG认证培训 ( 京ICP备11008061号 )

GMT+8, 2024-4-25 17:45 , Processed in 0.020185 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表