Chinaunix

标题: Oracle 10 g中Clob字段的更新问题 [打印本页]

作者: TOADLover    时间: 2010-01-07 13:23
标题: Oracle 10 g中Clob字段的更新问题
怎么更新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 编辑 ]
作者: renxiao2003    时间: 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>
作者: TOADLover    时间: 2010-01-07 13:24
标题: 在网上找到的信息包括:
http://www.java2s.com/Tutorial/O ... /Updateclobdata.htm


http://www.experts-exchange.com/Database/Oracle/Q_22105827.html

谁真正用过?

[ 本帖最后由 TOADLover 于 2010-1-7 13:29 编辑 ]
作者: TOADLover    时间: 2010-01-08 14:25
大家都没用过?
作者: TOADLover    时间: 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 编辑 ]
作者: TOADLover    时间: 2010-01-08 16:01
http://blog.csdn.net/annicybc/archive/2007/04/02/1549338.aspx
作者: TOADLover    时间: 2010-01-08 16:02
I.在调用写过程前一定要使用SELECT语句检索到定位器且用   FOR   UPDATE   子句锁定行,否则不能更新LOB;   
   
  II.写过程从offset指定的位置开始,向LOB中写入长度为amount的数据,原LOB中在这个范围内的任何数据都将被覆盖。   
   
  III.缓冲区的最大容量为32767字节,因此在写入大量数据时需多次调用该过程。
作者: renxiao2003    时间: 2010-01-08 21:50
谢谢你把我的答案做为你想要的答案。其实单纯从SQL语句我的可以,也有用程序处理的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2