共计 2438 个字符,预计需要花费 7 分钟才能阅读完成。
一、场景描述
业务需求,现在有张业务表的一个字段为 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.
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139388.htm
正文完
星哥玩云-微信公众号