加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Oracle更新BLOB或CLOB字段的方法

(2013-10-14 17:47:14)
标签:

it

oracle

Oracle 不允许使用SQL直接更新BLOB或CLOB字段,经过近两天的学习和摸索,特整理以下两种方法:

方法1,如需更新或录入的数据信息少于4K时,可以使用Varchar2作为存储过程的参数直接传入,但因中文或是UTF-8编码还需除2或除3,则可更新的内容更短,需注意数据被截断。。。

create or replace procedure TEST_BLOB_INS (FBuffer IN VARChAR2) IS
  DEST_LOB         BLOB;
  WRITE_AMOUNT     INTEGER ;
BEGIN
--FILE_CONTENT为指定大字段
  UPDATE XXTABLE SET FILE_CONTENT=EMPTY_BLOB() WHERE ID= 999 ; 
  SELECT FILE_CONTENT  INTO DEST_LOB  FROM  XXTABLE   WHERE ID = 999 FOR UPDATE;
  DBMS_LOB.OPEN(DEST_LOB,DBMS_LOB.LOB_READWRITE);
  WRITE_AMOUNT := LENGTHB(WR_BUFFER) ; 
  DBMS_LOB.WRITE(DEST_LOB, WRITE_AMOUNT, 1, UTL_RAW.cast_to_raw(WR_BUFFER));
  DBMS_LOB.CLOSE(DEST_LOB);
  COMMIT;
END TEST_BLOB;

方法2,对超过4000字节的内容需存入BLOB, CLOB字段,如较大的文本文件或是图形数据,可以通过读写文件再写入数据库的方式,具体过程:
A,首先请DBA在控制台创建目录记录
     CREATE OR REPLACE DIRECTORY MY_DIR as '/home/jsp';
     -- 可使用 select * from dba_directories 进行查询是否创建成功;
B,再将新建的MY_DIR目录别名授权给指定用户使用
GRANT READ,WRITE on DIRECTORY MY_DIR TO  user_cms ; 

C,将拟存入数据库的文件上传至服务器的/home/jsp目录下

D,再使用以下过程进行文件读出并写入数据库, FName 为文件名, RecID为指定表记录的ID

create or replace procedure TEST_BLOB_FILEINS(RECID IN INTEGER,FName IN VARCHAR2) IS
  DEST_LOB BLOB;
  V_FILE BFILE ; 
  V_Fsize INTEGER ; 
BEGIN
 V_FILE := BFILENAME('MY_DIR', FName);
 UPDATE xxTAble SET FILE_CONTENT=EMPTY_BLOB() WHERE ID= RECID RETURN FILE_CONTENT INTO DEST_LOB; 
 v_FSize := DBMS_LOB.GETLENGTH(v_file);
 DBMS_OUTPUT.PUT_LINE('File size: ' || v_Fsize);
 DBMS_LOB.FILEOPEN(V_FILE);
 DBMS_LOB.LOADFROMFILE(DEST_LOB, V_FILE, DBMS_LOB.LOBMAXSIZE);
 DBMS_LOB.FILECLOSEALL;
 COMMIT;
  
  EXCEPTION 
   WHEN OTHERS THEN 
      DBMS_OUTPUT.PUT_LINE('在更新BLOB内容时不成功,ID=' || RECID ) ; 
 
END TEST_BLOB;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有