一、场景描述
业务需求,现在有张业务表的一个字段为clob类型,要将该字段中部分内容的日期'2016年04月22日’修改为'2016年04月11日’,该替换需要用到replace参数, 注意:oracle 10g 版本以上可使用regexp_replace参数。让我们实验来用用看。
二、实验
1.创建测试表及数据
-
SAM@OCM11G >create table test_lob(id number,text clob);
-
-
Table created.
2.修改系统字符集,否则插入中文为乱码
-
[oracle@test ~]$ echo $LANG
-
en_US.UTF-8
-
-
[oracle@test ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
-
-
[oracle@test ~]$ echo $NLS_LANG
-
AMERICAN_AMERICA.AL32UTF8
3.插入测试数据
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (1,'你好,这里是SAM1的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (2,'你好,这里是SAM2的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (3,'你好,这里是SAM3的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (4,'你好,这里是SAM4的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (5,'你好,这里是SAM5的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (6,'你好,这里是SAM6的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (7,'你好,这里是SAM7的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >INSERT INTO TEST_LOB VALUES (8,'你好,这里是SAM8的测试环境。2016年12月30日');
-
-
1 row created.
-
-
SAM@OCM11G >commit;
-
-
Commit complete.
-
-
SAM@OCM11G >set lines 200
-
SAM@OCM11G >select * from test_lob;
-
-
ID TEXT
-
---------- --------------------------------------------------------------------------------
-
1 你好,这里是SAM1的测试环境。2016年12月30日
-
2 你好,这里是SAM2的测试环境。2016年12月30日
-
3 你好,这里是SAM3的测试环境。2016年12月30日
-
4 你好,这里是SAM4的测试环境。2016年12月30日
-
5 你好,这里是SAM5的测试环境。2016年12月30日
-
6 你好,这里是SAM6的测试环境。2016年12月30日
-
7 你好,这里是SAM7的测试环境。2016年12月30日
-
8 你好,这里是SAM8的测试环境。2016年12月30日
-
-
8 rows selected.
4.修改lob字段中信息日期语法
-
UPDATE table t
-
SET t.lob字段名 = REPLACE(t.lob字段名, ‘替换前内容', '替换后内容')
-
WHERE t.sale like '%替换前%;
5.修改lob字段中2016年12月30日为2017年01月07日
-
SAM@OCM11G >update test_lob t set t.text=replace(text,'2016年12月30日','2017年01月07日') where text like '%2016年12月30日%';
-
-
8 rows updated.
-
-
SAM@OCM11G >commit;
6.验证修改后的信息
-
SAM@OCM11G >select * from test_lob;
-
-
ID TEXT
-
---------- --------------------------------------------------------------------------------
-
1 你好,这里是SAM1的测试环境。2017年01月07日
-
2 你好,这里是SAM2的测试环境。2017年01月07日
-
3 你好,这里是SAM3的测试环境。2017年01月07日
-
4 你好,这里是SAM4的测试环境。2017年01月07日
-
5 你好,这里是SAM5的测试环境。2017年01月07日
-
6 你好,这里是SAM6的测试环境。2017年01月07日
-
7 你好,这里是SAM7的测试环境。2017年01月07日
-
8 你好,这里是SAM8的测试环境。2017年01月07日
-
-
8 rows selected.
三、总结
修改LOB字段信息中的字符串,不能按照以往的的update 表名 set 字段名=新值 where … 。正确的方法是使用REPLACE函数来替换。注意where 条件就好,借着新年,也祝各位DBA朋友们,HAPPY NEW YEAR.