ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle 用拼接字符串更新表 测试

Oracle 用拼接字符串更新表 测试

原创 Linux操作系统 作者:roominess 时间:2012-03-30 16:35:21 0 删除 编辑

先看我们的数据:

SQL> select count(1) from dave where cust_tel like '0551%';

 

 COUNT(1)

----------

     2723

 

在我们的Dave表里,cust_tel 电话以0551 开头的有2723条记录,现在我们把这些记录换成0556.

 

我们使用如下方法测试一下:

  1. SQL> select * from v$version;  
  2.    
  3. BANNER  
  4. ----------------------------------------------------------------------  
  5. Oracle Database 11g Enterprise EditionRelease 11.2.0.1.0 - Production  
  6. PL/SQL Release 11.2.0.1.0 - Production  
  7. CORE   11.2.0.1.0      Production  
  8. TNS for 32-bit Windows: Version 11.2.0.1.0- Production  
  9. NLSRTL Version 11.2.0.1.0 – Production  
  10.    
  11. SQL> UPDATE dave SET cust_tel = '0556'|| SUBSTR (cust_tel, 5) WHERE  cust_tellike '0551%';  
  12. 2723 rows updated.  
  13.    
  14. SQL> rollback;  
  15. Rollback complete.  
  16.    
  17. SQL> UPDATE dave SET cust_tel = '0556'|| SUBSTR (cust_tel, 5) WHERE  cust_telin (select cust_tel from dave where cust_tel like '0551%');  
  18. 2723 rows updated.  
  19.    
  20. SQL> rollback;  
  21. Rollback complete.  

写法很多,关键要注意效率问题,尤其是要更新的数据量比较大时。

 

另测试发现Oracle10g 和11g 在语法支持上的一些区别:

 

在Oracle 10g上可以使用如下语法:

  1. BEGIN  
  2.    FOR cl IN (SELECT object_name from d1 WHEREobject_type='TABLE')  
  3.    LOOP  
  4.       UPDATE d1  
  5.          SET object_name = 'D' || SUBSTR (object_name, 2)  
  6.        WHERE object_name = cl.object_name;  
  7.    END LOOP;  
  8. END;  


 

但如果在Oracle 11g中使用如下语法:

  1. BEGIN  
  2.    FOR cl IN (SELECT id from dave WHERE cust_tel LIKE '0551%')  
  3.    LOOP  
  4.       UPDATE dave  
  5.          SET cust_tel = '0556' || SUBSTR (cust_tel, 5)  
  6.        WHERE id = cl.id;  
  7.    END LOOP;  
  8. END;  


 

则会一致处于等待状态。

 

但是在Oracle 11g中,可以使用如下的游标来处理,这种方法也是我们之前的提高的根据rowid 来完成大量的Update操作:

  1. DECLARE  
  2.   CURSOR cur IS  
  3.     SELECT rowid as ROW_ID from dave WHEREcust_tel LIKE '0551%' ORDER BY ROWID;  ---如果表的数据量不是很大,可以不用 order by rowid  
  4.   V_COUNTER NUMBER;  
  5. BEGIN  
  6.   V_COUNTER := 0;  
  7.   FOR row IN cur LOOP  
  8.     UPDATE dave  
  9.        SET cust_tel = '0556' || SUBSTR (cust_tel, 5)  
  10.      WHERE ROWID = row.ROW_ID;  
  11.    V_COUNTER := V_COUNTER + 1;  
  12.     IF (V_COUNTER>= 1000) THEN  
  13.       COMMIT;  
  14.      V_COUNTER := 0;  
  15.     END IF;  
  16.   END LOOP;  
  17.  COMMIT;  
  18. END;  


 

 

有关这种方法的具体说明参考:

Oracle 利用 rowid 提升 update 性能

http://blog.csdn.net/tianlesoftware/article/details/6576156

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15880878/viewspace-719945/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-24

  • 博文量
    118
  • 访问量
    186190