博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 用拼接字符串更新表 测试
阅读量:5101 次
发布时间:2019-06-13

本文共 2292 字,大约阅读时间需要 7 分钟。

 

先看我们的数据:

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

 

 COUNT(1)

----------

     2723

 

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

 

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

SQL> select * from v$version; BANNER ---------------------------------------------------------------------- Oracle Database 11g Enterprise EditionRelease 11.2.0.1.0 - Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for 32-bit Windows: Version 11.2.0.1.0- Production NLSRTL Version 11.2.0.1.0 – Production SQL> UPDATE dave SET cust_tel = '0556'|| SUBSTR (cust_tel, 5) WHERE cust_tellike '0551%'; 2723 rows updated. SQL> rollback; Rollback complete. SQL> UPDATE dave SET cust_tel = '0556'|| SUBSTR (cust_tel, 5) WHERE cust_telin (select cust_tel from dave where cust_tel like '0551%'); 2723 rows updated. SQL> rollback; Rollback complete.

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

 

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

 

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

BEGIN FOR cl IN (SELECT object_name from d1 WHEREobject_type='TABLE') LOOP UPDATE d1 SET object_name = 'D' || SUBSTR (object_name, 2) WHERE object_name = cl.object_name; END LOOP; END;

 

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

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

 

则会一致处于等待状态。

 

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

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

 

 

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

 

 

 

 

 

-------------------------------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Blog:   http://blog.csdn.net/tianlesoftware

Weibo:            http://weibo.com/tianlesoftware

Email:            

Skype:            tianlesoftware

 

-------加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请----

DBA1 群:62697716(满);   DBA2 群:62697977(满)  DBA3 群:62697850(满)  

DBA 超级群:63306533(满);  DBA4 群:83829929   DBA5群: 142216823

DBA6 群:158654907    DBA7 群:172855474  DBA8群:102954821    

转载于:https://www.cnblogs.com/zlja/archive/2011/12/10/2449516.html

你可能感兴趣的文章
文本主题模型之LDA(一) LDA基础
查看>>
linux基础命令-chgrp/chown/chomd
查看>>
待整理
查看>>
iOS 6
查看>>
Nginx入门篇-基础知识与linux下安装操作
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
1.linux ping:unknown host www.***.***
查看>>
无向图求桥 UVA 796
查看>>
Nginx+Keepalived 实现双击热备及负载均衡
查看>>
五分钟搭建WordPress博客(二)
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
Something-Summary
查看>>
Spring学习笔记
查看>>
6个有用的MySQL语句
查看>>
linux c/c++ IP字符串转换成可比较大小的数字
查看>>
我对前端MVC的理解
查看>>
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>