Oracle中BLOB/CLOB相关操作的使用笔记

本文介绍如何使用PL/SQL进行BLOB数据的读取和写入操作,包括创建表、目录、存储过程等步骤,并展示了具体的操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用pl/sql读取写入blob对象

一、写文件到BLOB
SQL
>createtableiihero_blob(fidintprimarykey,fnamevarchar(32),fblob);

表已创建。

SQL
>conn/assysdba
已连接。
SQL
>createorreplacedirectoryBLOBDIRas'd:oraclefile';

目录已创建。

SQL
>grantreadondirectoryBLOBDIRtotest;

授权成功。

SQL
>conntest/test
已连接。

SQL
>createsequences_iihero_seq
2startwith1
3incrementby1
4/

序列已创建。

CREATEORREPLACEPROCEDUREiihero_load_blob(pfnameVARCHAR2)
IS
src_fileBFILE;
dst_fileBLOB;
lgh_fileBINARY_INTEGER;
BEGIN
src_file:
=bfilename('BLOBDIR',pfname);

INSERTINTOiihero_blob(fid,fname,f)
VALUES(S_IIHERO_SEQ.Nextval,pfname,EMPTY_BLOB())
RETURNINGf
INTOdst_file;

SELECTfINTOdst_file
FROMiihero_blobWHEREfname=pfnameFORUPDATE;

dbms_lob.fileopen(src_file,dbms_lob.file_readonly);
lgh_file:
=dbms_lob.getlength(src_file);
dbms_lob.loadfromfile(dst_file,src_file,lgh_file);

UPDATEiihero_blobSETf=dst_file
WHEREfname=pfname;

dbms_lob.fileclose(src_file);
commit;
ENDiihero_load_blob;
/


SQL
>colsegment_namefora30
SQL
>conn/assysdba
已连接。
SQL
>selectsegment_name,segment_type,bytes/1024/1024fromdba_segmentswhereow
ner
='TEST';

SEGMENT_NAMESEGMENT_TYPEBYTES
/1024/1024
---------------------------------------------------------------
ST_COURSETABLE.0625
TAB2
TABLE.0625
IIHERO_BLOB
TABLE.0625
SYS_LOB0000030667C00003$$LOBSEGMENT.
0625

已选择34行。

SQL
>conntest/test
已连接。
SQL
>

4.装数据(写数据到BLOB)

SQL
>execiihero_load_blob('ttt.txt');

PL
/SQL过程已成功完成。

SQL
>selectfid,fname,dbms_lob.getlength(f)fromiihero_blob;

FIDFNAMEDBMS_LOB.GETLENGTH(F)
---------------------------------------------------------------
1ttt.txt28729

二、将BLOB中的数据读到文件
1.确认有数据
SQL
>selectfid,fname,dbms_lob.getlength(f)fromiihero_blob;

FIDFNAMEDBMS_LOB.GETLENGTH(F)
---------------------------------------------------------------
1ttt.txt28729

2.创建目录
SQL
>conn/assysdba
已连接。
SQL
>createorreplacedirectoryBLOBDIRas'd:oraclefile';
目录已创建。
SQL
>grantread,writeondirectoryBLOBDIRtotest;
授权成功。

3.创建存储过程
conntest
/test

CREATEORREPLACEPROCEDUREiihero_dump_blob(pinamevarchar2,ponamevarchar2)IS
l_fileUTL_FILE.FILE_TYPE;
l_buffer
RAW(32767);
l_amountBINARY_INTEGER:
=32767;
l_pos
INTEGER:=1;
l_blobBLOB;
l_blob_len
INTEGER;
BEGIN
SELECTfINTOl_blobFROMiihero_blobWHEREFNAME=piname;
l_blob_len:
=DBMS_LOB.GETLENGTH(l_blob);
--dbms_output.put_line(l_blob_len);
--l_file:=UTL_FILE.FOPEN('BLOBDIR',poname,'wb',32767);
l_file:=UTL_FILE.FOPEN('BLOBDIR',poname,'w',32767);

WHILEl_pos<l_blob_lenLOOP
DBMS_LOB.
READ(l_blob,l_amount,l_pos,l_buffer);
UTL_FILE.PUT_RAW(l_file,l_buffer,TRUE);
l_pos:
=l_pos+l_amount;
ENDLOOP;

UTL_FILE.FCLOSE(l_file);

EXCEPTION
WHENOTHERSTHEN
IFUTL_FILE.IS_OPEN(l_file)THEN
UTL_FILE.FCLOSE(l_file);
ENDIF;
RAISE;
END;
/

SQL
>hostdir/b/sd:oraclefile
d:oraclefileexample.txt
d:oraclefile tt.txt




<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值