【TechTarget中国原创】问:请问在Oracle数据库中,如何插入并检索二进制大对象数据(BLOB)?
答:我建议在处理大对象数据之前,先阅读一下“Oracle应用开发者指南”中的大对象部分。
下面给出的链接就是在线版本,其中14章给出了一些插入和读取BLOB的例子:
14章
下面我通过一个具体的实例,来演示如何将外部文件导入一个BLOB列中:
第一步:创建一个目录,指向BLOB的位置。将“blob_dir”替换成“/oradata/blobs”。
第二步:为使用该目录的用户提供可读授权。
第三步:创建大对象表。
-- the storage table for the image file
CREATE TABLE my_blobs (
dname VARCHAR2(30), -- directory name
sname VARCHAR2(30), -- subdirectory name or description
fname VARCHAR2(30), -- file name
fblob BLOB); -- blob file
第四步:创建一个存储过程,用来插入BLOB对象。
-- create the procedure to load the blob file
CREATE OR REPLACE PROCEDURE load_blob (
pdname VARCHAR2,
psname VARCHAR2,
pfname VARCHAR2) IS
src_file BFILE;
dst_file BLOB;
lgh_file BINARY_INTEGER;
BEGIN
src_file := bfilename('BLOB_DIR', pfname);
-- insert a NULL record to lock
INSERT INTO my_blobs
(dname, sname, fname, fblob)
VALUES
(pdname, psname, pfname, EMPTY_BLOB())
RETURNING fblob INTO dst_file;
-- lock record
SELECT fblob
INTO dst_file
FROM my_blobs
WHERE dname = pdname
AND sname = psname
AND fname = pfname
FOR UPDATE;
-- open the file
dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
-- determine length
lgh_file := dbms_lob.getlength(src_file);
-- read the file
dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
-- update the blob field
UPDATE my_blobs
SET fblob = dst_file
WHERE dname = pdname
AND sname = psname
AND fname = pfname;
-- close file
dbms_lob.fileclose(src_file);
END load_file;
/
第五步:执行存储过程。
SQL> exec load_blob('BLOB_DIR','Head shot photo','km_pic.png');
PL/SQL procedure successfully completed.
你现在可以通过检查大小,来验证原始对象与数据库对象的匹配。
第六步:从OS上检查BLOB大小。
SQL> !ls -l /oradata/blobs/km_pic.png
-rwxr-xr-x 1 oracle oinstall 21150 Jan 6 01:55 /oradata/blobs/km_pic.png
第七步:从Oracle检查BLOB大小。
1 declare
2 a blob;
3 begin
4 select fblob into a from my_blobs;
5 dbms_output.put_line(dbms_lob.getlength(a));
6* end;
SQL> /
21150
PL/SQL procedure successfully completed.
TechTarget中国原创内容,原文链接: