免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5375 | 回复: 5
打印 上一主题 下一主题

Oracle 10 g中Clob字段的更新问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-07 13:23 |只看该作者 |倒序浏览
30可用积分
怎么更新Oracle 10g中的Clob 字段?

例如,有个表:
CREATE TABLE MAP_LOT
(
  PKI_NO       VARCHAR2(32 BYTE),
  ET_TIME      DATE,
  MAP          CLOB,
  DEVICE  VARCHAR2(128 CHAR)               DEFAULT NULL
)

程序运行了一段时间后,现在要更新MAP字段,把其中的字符a,更新成字符b,应该怎么办?

关键是这个MAP字段现在含有1千个左右的字符,且没有规律,现在要把其中出现的字符a,更新成字符b

[ 本帖最后由 TOADLover 于 2010-1-7 13:29 编辑 ]

最佳答案

查看完整内容

直接使用replace函数试试,update map_lot set map=replace(map,'a','b');下面是我的结果:SQL> create table tstclb(a int,b clob);表已创建。SQL> insert into tstclb values(1,'aaabbbcccddd');已创建 1 行。SQL> commit;提交完成。SQL> update tstclb set b = replace(b,'a','x');已更新 1 行。SQL> select * from tstclb; A----------B---------------------------------------------------------------------------- ...

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-01-07 13:23 |只看该作者
直接使用replace函数试试,update map_lot set map=replace(map,'a','b');

下面是我的结果:
SQL> create table tstclb(a int,b clob);

表已创建。

SQL> insert into tstclb values(1,'aaabbbcccddd');

已创建 1 行。

SQL> commit;

提交完成。

SQL> update tstclb set b = replace(b,'a','x');

已更新 1 行。

SQL> select * from tstclb;

         A
----------
B
--------------------------------------------------------------------------------

         1
xxxbbbcccddd


SQL>

论坛徽章:
0
3 [报告]
发表于 2010-01-07 13:24 |只看该作者

在网上找到的信息包括:

论坛徽章:
0
4 [报告]
发表于 2010-01-08 14:25 |只看该作者
大家都没用过?

论坛徽章:
0
5 [报告]
发表于 2010-01-08 15:51 |只看该作者

回复 #2 renxiao2003 的帖子

吐血了,猜猜我怎么做的?
我绕地球跑了一圈:
--------------------------------------------
1. CREATE TABLE view_sites_info     
(
           site_id NUMBER(3),
           audio BLOB DEFAULT   empty_blob(),
           document CLOB DEFAULT   empty_clob(),
           video_file BFILE DEFAULT   NULL,
           CONSTRAINT PK_TAB_view_sites_info PRIMARY KEY (site_id)     
)

2. delete from view_sites_info;

3. insert into view_sites_info(site_id) values (100);

4. select * from view_sites_info;

5.  --************************************** below is write
DECLARE
  lobloc   CLOB;  
  buffer   VARCHAR2(2000);   
  amount   NUMBER   :=   20;   
  offset   NUMBER   :=   1;     
   
  BEGIN
  buffer   :=   'This   is   a   writing   example';     
  amount   :=   length(buffer);     
  SELECT   document   INTO   lobloc  FROM view_sites_info WHERE   site_id   =   100   FOR   UPDATE;      
  
  dbms_lob.write(lobloc,amount,1,buffer);     
   
  COMMIT;
  END;
  
6.  --*************************************** below is read

declare
doc_len NUMBER;-- clob length
doc_loc CLOB;--clob content
buffer_read   VARCHAR2(2000);
offset NUMBER := 1;
amount NUMBER := 2000;
BEGIN
          SELECT length(document), document INTO doc_len, doc_loc FROM view_sites_info WHERE site_id = 100;
          dbms_lob.read(doc_loc,amount,offset,buffer_read);
          dbms_output.put_line(buffer_read);
END;
7.  --****************************************** below is update
declare
   step_char VARCHAR2(1);
   pos NUMBER := 1;-- position
   doc_len NUMBER;-- clob length
   doc_loc CLOB;--clob location
   
   buffer_read  VARCHAR2(2000);
   buffer_write VARCHAR2(2000);      
   offset NUMBER := 1;
   amount NUMBER := 2000;
   
BEGIN
         SELECT length(document), document INTO doc_len, doc_loc FROM view_sites_info WHERE site_id = 100 FOR UPDATE;
         dbms_lob.read(doc_loc,amount,offset,buffer_read);
         
         WHILE (pos < doc_len + 1) LOOP
                   --select substr(buffer_read,pos, 1) INTO step_char FROM dual;
                   step_char := substr(buffer_read,pos, 1);
                   IF step_char = 'i'  Then
                      step_char := 'a';
                   END IF;
                   buffer_write := buffer_write || step_char;
                    pos := pos + 1;
         END LOOP;
         
         dbms_lob.write(doc_loc, amount, 1, buffer_write);
         COMMIT;
END;

[ 本帖最后由 TOADLover 于 2010-1-8 15:59 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2010-01-08 16:01 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2010-01-08 16:02 |只看该作者
I.在调用写过程前一定要使用SELECT语句检索到定位器且用   FOR   UPDATE   子句锁定行,否则不能更新LOB;   
   
  II.写过程从offset指定的位置开始,向LOB中写入长度为amount的数据,原LOB中在这个范围内的任何数据都将被覆盖。   
   
  III.缓冲区的最大容量为32767字节,因此在写入大量数据时需多次调用该过程。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
8 [报告]
发表于 2010-01-08 21:50 |只看该作者
谢谢你把我的答案做为你想要的答案。其实单纯从SQL语句我的可以,也有用程序处理的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP