Oracle的lob字段操作联系

一、把一个大文件写入到数据库clob字段中去。
 
--1.创建一个路径
create directory lob_src as 'e:\lob' ; 
--2.创建一个序列
create sequence doc_seq; 
--3.创建包含clob字段的表txt_docs。
create table txt_docs ( 
doc_num number, 
doc_nm  varchar2(100), 
doc_clb clob, 
ins_ts  timestamp 
); 
--4.把文件写入到数据库的表中去。
declare
  src_clb     bfile; --指向操作系统源文件的bfile类型指针
  dst_clb     clob; --声明一个clob变量
  src_doc_nm  varchar2(100) := '1.doc';
  src_offset  integer := 1; --源文件开始读取位置
  dst_offset  integer := 1; --目标文件开始读取位置
  lang_ctx    integer := dbms_lob.default_lang_ctx;
  warning_msg number; --当遇到不能转换的字符时返回错误信息
begin
  --得到指向文件的指针
  src_clb := bfilename('LOB_SRC', src_doc_nm);
  -- within the Oracle directory 
  -- create LOB placeholder column first 
  insert into txt_docs(doc_num, doc_nm, doc_clb, int_ts)
  values (doc_seq.nextval, src_doc_nm, empty_clob(), systimestamp)
  returning doc_clb into dst_clb; 
  dbms_lob.open(src_clb, dbms_lob.lob_readonly);
  dbms_lob.loadclobfromfile(dest_lob     => dst_clb,
                            src_bfile    => src_clb,
                            amount       => dbms_lob.lobmaxsize,
                            dest_offset  => dst_offset,
                            src_offset   => src_offset,
                            bfile_csid   => dbms_lob.default_csid,
                            lang_context => lang_ctx,
                            warning      => warning_msg);
  dbms_lob.close(src_clb);
  commit;
  dbms_output.put_line('Wrote CLOB to table: ' || src_doc_nm);
end;
  
Wrote CLOB to table: 1.doc
PL/SQL 过程已成功完成。
--5.查询
select doc_num, doc_nm, int_ts,length(doc_clb) from txt_docs
 
二、把一个图像数据读入到数据库blob字段中
 
1、
SQL> create sequence img_seq;
序列已创建。
2、
SQL> create table image
  2  (img_num         number,
  3  img_nm           varchar2(100),
  4  img_blb          blob,
  5  ins_ts           timestamp);
表已创建。
3、
SQL> declare
  2    src_blb    bfile; /* point to source BLOB on file system         */
  3    dst_blb    blob; /* destination BLOB in table                   */
  4    src_img_nm varchar2(100) := 'Screen Capture.bmp';
  5    src_offset integer := 1; /* where to start in the source BLOB              */
  6    dst_offset integer := 1; /* where to start in the target BLOB              */
  7  begin
  8    src_blb := bfilename('LOB_SRC', src_img_nm);
  9    insert into image
 10      (img_num, img_nm, img_blb, ins_ts)
 11    values
 12      (img_seq.nextval, src_img_nm, empty_blob(), systimestamp)
 13    returning img_blb into dst_blb;
 14    dbms_lob.open(src_blb, dbms_lob.lob_readonly);
 15    dbms_lob.loadblobfromfile(dest_lob  => dst_blb,
 16                              src_bfile => src_blb,
 17                              amount      => dbms_lob.lobmaxsize,
 18                              dest_offset => dst_offset,
 19                              src_offset  => src_offset);
 20    dbms_lob.close(src_blb);
 21    commit;
 22    dbms_output.put_line('Wrote BLOB to table: ' || src_img_nm);
 23  end;
 24  /
Wrote BLOB to table: Screen Capture.bmp
PL/SQL 过程已成功完成。
4、
SQL> select img_num, img_nm, ins_ts, length(img_blb) from image;
 
三、用SQL*Loader批量加载大数据对象。
 
1、建立控制文件load_lobs.ctl :
load data 
infile load_lobs.list 
append into table image 
fields terminated by ',' 
trailing nullcols 
 img_num            char, 
 img_nm             char(100), 
 img_file_nm        filler char(100), 
 img_blb            lobfile(img_file_nm) terminated by EOF, 
 ins_ts             "systimestamp" 
2、建立批量处理文件清单load_lobs.list:
101,Water Table Analysis,1.bmp 
102,My Antiques,2.bmp 
103,Screen Capture for Book,3.bmp 
 
3、进入命令行处理模式:
E:\lob>sqlldr userid=hdtest/test@orcl control=load_lobs.ctl
SQL*Loader: Release 10.2.0.1.0 - Production on 星期二 12月 8 14:39:30 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
达到提交点 - 逻辑记录计数 2
达到提交点 - 逻辑记录计数 3
 
4、查看结果:
select img_num, img_nm, ins_ts, length(img_blb) from image;
 
四、存储bfile类型的大数据对象。只存储指向,不真正存储,可以提高磁盘利用率。
1、建立包含bfile类型的表。
SQL> create table web_img2
  2  (
  3  img_num         number primary key,
  4  img_url           varchar2(255),
  5  img_blb           bfile,
  6  ins_ts            timestamp,
  7  constraint ak1_web_img2 unique(img_url)
  8  );
表已创建。
2、建立序列
SQL> create sequence web_img2_seq;
序列已创建。
3、建立load_bfile过程,这个过程可以插入数据和查询bfile执行的文件是否存在。
SQL> create or replace procedure load_bfile(dir_name   varchar2,
  2                                         src_img_nm in varchar2) is
  3    src_blb     bfile; /* point to source BLOB on file system          */
  4    file_exists boolean; /* return value from UTL_FILE.FGETATTR          */
  5    file_len    number;
  6    blksize     binary_integer;
  7  begin
  8    src_blb := bfilename(dir_name, src_img_nm);
  9    insert into web_img2
 10      (img_num, img_url, img_blb, ins_ts)
 11    values
 12      (web_img2_seq.nextval, src_img_nm, src_blb, systimestamp);
 13    -- check to see if file is there at this moment
 14    utl_file.fgetattr(dir_name, src_img_nm, file_exists, file_len, blksize);
 15    if file_exists then
 16      commit;
 17      dbms_output.put_line('Wrote BFILE pointer to table: ' || src_img_nm);
 18    else
 19      rollback;
 20      dbms_output.put_line('BLOB ' || src_img_nm || ' in directory ' ||
 21                           dir_name || ' does not exist.');
 22    end if;
 23  end;
 24  /
过程已创建。
4、
begin 
   load_bfile('LOB_SRC','Cake Boss.bmp'); 
end;
 
五、删除和更新数据库中的lob字段。
 
1、字段清空,请用empty_blob函数。
update web_img set img_blb = empty_blob() where img_num = 19; 
2、dbms_lob.copy函数。
dbms_lob.copy (existing_blb, new_blb, 5000, 125, 10); 
DBMS_LOB.COPY 
  dest_lob       IN OUT NOCOPY BLOB, -- BLOB to be updated 
  src_lob        IN               BLOB,      -- BLOB containing new content 
  amount         IN               INTEGER, -- number of bytes to copy 
  dest_offset IN                  INTEGER := 1,     -- where to start in the destination 
  src_offset     IN               INTEGER := 1      -- where to start in the source 
); 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7204674/viewspace-621994/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7204674/viewspace-621994/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值