试过了MSSQL的分块读取Blob字段,又尝试在Oracle下完成,发现还是可行的。
首先建立一个存储过程:
create or replace procedure PRO_GET_BLOB( I_PKGID IN INTEGER, --文件ID I_MOUNT IN INTEGER, --复制数据数量(Byte) I_OFFSET IN INTEGER, --起始位置 B_RESULT IN OUT BLOB) --返还结果 is B_TEMP BLOB; begin --将BLOB数据读取到变量,其实是传递了一个指针 SELECT FILE_DATA INTO B_TEMP FROM T_SYS_PKG_FILE WHERE PKG_ID = I_PKGID; --从BLOB中读取所需要的数据,并返还给参数 DBMS_LOB.Copy(B_RESULT,B_TEMP, I_MOUNT,1, I_OFFSET); end PRO_GET_BLOB;
其核心就是利用DBMS_LOB函数进行处理,在将数据库Blob字段读取到Blob变量时,应该是传递的数据指针,而不是具体的数据,用一个47M的文件进行反复读写过程,也没有发现Oracle内存发生多大变化。这样一来无论是内存还是CPU占用都非常小。如下图:
在客户端执行存储过程,读取返回参数的值,实现对Blob字段的分块获取。