一、把一个大文件写入到数据库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/