使用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())
RETURNINGfINTOdst_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
TAB2TABLE.0625
IIHERO_BLOBTABLE.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_bufferRAW(32767);
l_amountBINARY_INTEGER:=32767;
l_posINTEGER:=1;
l_blobBLOB;
l_blob_lenINTEGER;
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
一、写文件到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())
RETURNINGfINTOdst_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
TAB2TABLE.0625
IIHERO_BLOBTABLE.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_bufferRAW(32767);
l_amountBINARY_INTEGER:=32767;
l_posINTEGER:=1;
l_blobBLOB;
l_blob_lenINTEGER;
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