资料一
//ORACLE 保存图片
grant create any directory to scott;
grant create any library to scott;
create or replace directory utllobdir as d: oracle;
create table bfile_tab (bfile_column BFILE);
create table utl_lob_test (blob_column BLOB);
set serveroutput on
然后执行下面语句就将d: oracle目录下的Azuljpg存入到utl_lob_test
表中的blob_column字段中了
declare
a_blob BLOB;
a_bfile BFILE := BFILENAME(UTLLOBDIRAzuljpg);
begin
insert into bfile_tab values (a_bfile)
returning bfile_column into a_bfile;
insert into utl_lob_test values (empty_blob())
returning blob_column into a_blob;
dbms_lobfileopen(a_bfile);
dbms_lobloadfromfile(a_blob a_bfile dbms_lobgetlength(a_bfile));
dbms_lobfileclose(a_bfile);
commit;
end;
/
资料二
ORACLE中LOB字段的使用和维护
摘要本文通过实例介绍了在ORACLE数据库中通过DBMS_LOB包使用和维护LOB数据类型的基本方法
关键词ORACLE DBMS_LOB LOB 维护
中图分类号TP
引言
随着社会的发展在现代信息系统的开发中需要存储的已不仅仅是简单的文字信息同时还包括一些图片和音像资料或者是超长的文本比如开发一套旅游信息系统每一个景点都有丰富的图片音像资料和大量的文字介绍这就要求后台数据库要有存储这些数据的能力ORACLE公司在其Oraclei中通过提供LOB字段实现了该功能
为了便于读者的理解我们先介绍一些基本的概念
在ORACLE数据库中LOB(Large Objects—大对象)是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达GB的数据)目前它又分为两种类型内部LOB和外部LOB内部LOB将数据以字节流的形式存储在数据库的内部因而内部LOB的许多操作都可以参与事务也可以像处理普通数据一样对其进行备份和恢复操作Oraclei支持三种类型的内部LOBBLOB(二进制数据)CLOB(单字节字符数据)NCLOB(多字节国家字符数据)其中CLOB和NCLOB类型适用于存储超长的文本数据BLOB字段适用于存储大量的二进制数据如图像视频音频等目前Oraclei只支持一种外部LOB类型即BFILE类型在数据库内该类型仅存储数据在操作系统中的位置信息而数据的实体以外部文件的形式存在于操作系统的文件系统中因而该类型所表示的数据是只读的不参与事务该类型可帮助用户管理大量的由外部程序访问的文件
为了方便下文的叙述我们假定使用如下语句在数据库中创建了一张表
CREATE TABLE view_sites_info
(
site_id NUMBER()
audio BLOB DEFAULT empty_blob()
document CLOB DEFAULT empty_clob()
video_file BFILE DEFAULT NULL
constraint PK_TAB_view_sites_info primary key (site_id)
);
LOB的使用和维护
ORACL提供了多种使用和维护LOB的方式如使用PL/SQL DBMS_LOB包调用OCI(Oracle Call Interface)使用Proc * C/C++使用JDBC等其中最为方便有效的是使用PL/SQL调用DBMS_LOB包本文就将介绍该方法
在Oracle中存储在LOB中数据称为LOB的值如使用Select 对某一LOB字段进行选择则返回的不是LOB的值而是该LOB字段的定位器(可以理解为指向LOB值的指针)如执行如下的SQL语句
DELCARE
AUDIO_INFO BLOB
BENGIN
SELECT audio INTO AUDIO_INFO FROM view_sites_info
WHERE site_id=;
END;
/
存储在AUDIO_INFO变量中的就是LOB定位器而不是LOB的值而要对某一LOB的值进行访问和维护操作必需通过其定位器来进行DBMS_LOB包中提供的所有函数和过程都以LOB定位器作为参数
内部LOB
DBMS_LOB包中主要提供了以下几个过程供用户对内部LOB字段进行维护
APPEND() 将源LOB中的内容加到目的LOB中
COPY() 从源LOB中复制数据到目的LOB
ERASE() 删除LOB中全部或部分内容
TRIM() 将LOB值减少到指定的长度
WRITE() 向LOB 中写入数据
COMPARE() 比较两个同种数据类型的LOB的部分或全部值是否相同
GETLENGTH() 获取LOB的长度
READ() 从LOB中读出数据
下面我们以最为常用的读和写为例详细介绍这些过程的用法
首先介绍一下写过程该过程的语法为
PROCEDURE WRITE (
lob_loc IN OUT BLOB
amount IN BINARY_INTEGER
offset IN INTEGER
buffer IN RAW);
PROCEDURE WRITE (
lob_loc IN OUT CLOB CHARACTER SET ANY_CS
amount IN BINARY_INTEGER
offset IN INTEGER
buffer IN VARCHAR CHARACTER SET lob_loc%CHARSET);
各参数的含义为
lob_loc要写入的LOB定位器
amount写入LOB中的字节数
offset指定开始操作的偏移量
buffer 指定写操作的缓沖区
下面的代码就是运用该过程向LOB字段写入数据的示例
DECLARE
lobloc CLOB;
buffer VARCHAR();
amount NUMBER := ;
offset NUMBER := ;
BEGIN
初始化要写入的数据
buffer := This is a writing example;
amount := length(buffer);
SELECT document INTO lobloc 获取定位器并锁定行
FROM view_sites_info
WHERE site_id = FOR UPDATE;
dbms_lobwrite(loblocamountbuffer);
COMMIT;
END;
/
需要特别指出的是
I 在调用写过程前一定要使用SELECT语句检索到定位器且用 FOR UPDATE 子句锁定行否则不能更新LOB
II 写过程从offset指定的位置开始向LOB中写入长度为amount的数据原LOB中在这个范围内的任何数据都将被覆盖
III 缓沖区的最大容量为字节因此在写入大量数据时需多次调用该过程
下面再来介绍一下读过程
该过程的语法为
PROCEDURE READ (
lob_loc IN BLOB
amount IN OUT BINARY_INTEGER
offset IN INTEGER
buffer OUT RAW);
PROCEDURE READ (
lob_loc IN CLOB CHARACTER SET ANY_CS
amount IN OUT BINARY_INTEGER
offset IN INTEGER
buffer OUT VARCHAR CHARACTER SET lob_loc%CHARSET);
各参数的含义为
lob_loc要读取的LOB定位器
amount要读取的字节数
offset开始读取操作的偏移量
buffer 存储读操作结果的缓沖区
下面的代码演示了如何使用该过程读取LOB字段中的数据
DECLARE
lobloc CLOB;
buffer VARCHAR();
amount NUMBER := ;
offset NUMBER := ;
BEGIN
SELECT document INTO lobloc 获取定位器
FROM lob_store
WHERE lob_id = ;
dbms_lobread(loblocamountoffsetbuffer);读取数据到缓沖区
dbms_outputput_line(buffer);显示缓沖区中的数据
COMMIT;
END;
/
资料三java实现
Java代码
import javasql*;
import javaio*;
import javautil*;
// Importing the Oracle Jdbc driver package makes the code more readable
import oraclejdbcdriver*;
//needed for new CLOB and BLOB classes
import oraclesql*;
public class LobExample
{
public static void main (String args [])
throws Exception
{
// Register the Oracle JDBC driver
DriverManagerregisterDriver(new oraclejdbcdriverOracleDriver());
// Connect to the database
// You can put a database name after the @ sign in the connection URL
Connection conn =
DriverManagergetConnection (jdbc:oracle:oci:@ scott tiger);
// Its faster when auto commit is off
connsetAutoCommit (false);
// Create a Statement
Statement stmt = conncreateStatement ();
try
{
stmtexecute (drop table basic_lob_table);
}
catch (SQLException e)
{
// An exception could be raised here if the table did not exist already
}
// Create a table containing a BLOB and a CLOB
stmtexecute (create table basic_lob_table (x varchar () b blob c clob));
// Populate the table
stmtexecute (insert into basic_lob_table values (one onetwothreefour));
stmtexecute (insert into basic_lob_table values (two twothreefourfivesix));
Systemoutprintln (Dumping lobs);
// Select the lobs
ResultSet rset = stmtexecuteQuery (select * from basic_lob_table);
while (rsetnext ())
{
// Get the lobs
BLOB blob = ((OracleResultSet)rset)getBLOB ();
CLOB clob = ((OracleResultSet)rset)getCLOB ();
// Print the lob contents
dumpBlob (conn blob);
dumpClob (conn clob);
// Change the lob contents
fillClob (conn clob );
fillBlob (conn blob );
}
Systemoutprintln (Dumping lobs again);
rset = stmtexecuteQuery (select * from basic_lob_table);
while (rsetnext ())
{
// Get the lobs
BLOB blob = ((OracleResultSet)rset)getBLOB ();
CLOB clob = ((OracleResultSet)rset)getCLOB ();
// Print the lobs contents
dumpBlob (conn blob);
dumpClob (conn clob);
}
// Close all resources
rsetclose();
stmtclose();
connclose();
}
// Utility function to dump Clob contents
static void dumpClob (Connection conn CLOB clob)
throws Exception
{
// get character stream to retrieve clob data
Reader instream = clobgetCharacterStream();
// create temporary buffer for read
char[] buffer = new char[];
// length of characters read
int length = ;
// fetch data
while ((length = instreamread(buffer)) != )
{
Systemoutprint(Read + length + chars: );
for (int i=; i<length; i++)
Systemoutprint(buffer[i]);
Systemoutprintln();
}
// Close input stream
instreamclose();
}
// Utility function to dump Blob contents
static void dumpBlob (Connection conn BLOB blob)
throws Exception
{
// Get binary output stream to retrieve blob data
InputStream instream = blobgetBinaryStream();
// Create temporary buffer for read
byte[] buffer = new byte[];
// length of bytes read
int length = ;
// Fetch data
while ((length = instreamread(buffer)) != )
{
Systemoutprint(Read + length + bytes: );
for (int i=; i<length; i++)
Systemoutprint(buffer[i]+ );
Systemoutprintln();
}
// Close input stream
instreamclose();
}
// Utility function to put data in a Clob
static void fillClob (Connection conn CLOB clob long length)
throws Exception
{
Writer outstream = clobgetCharacterOutputStream();
int i = ;
int chunk = ;
while (i < length)
{
outstreamwrite(i + hello world chunk);
i += chunk;
if (length i < chunk)
chunk = (int) length i;
}
outstreamclose();
}
// Utility function to put data in a Blob
static void fillBlob (Connection conn BLOB blob long length)
throws Exception
{
OutputStream outstream = blobgetBinaryOutputStream();
int i = ;
int chunk = ;
byte [] data = { };
while (i < length)
{
data [] = (byte)i;
outstreamwrite(data chunk);
i += chunk;
if (length i < chunk)
chunk = (int) length i;
}
outstreamclose();
}
}
给你这个例子看看一看就明白了
资料四C#实现
比如
FileStream fs=FileOpenRead(path);
long len=fsLength;
byte[] tempBuff= new byte[len];
fsRead(tempBuff ConvertToInt(len));
fsClose();
OracleConnection conn=new OracleConnection();
connOpen();
OracleCommand cmd=connCreateCommand();
cmdCommandText=SpName;//存储过程名
cmdCommandType=CommandTypeStoredProcedure;
cmdParametersAdd(p_filenameOracleTypeVarchar);
cmdParameters[p_filename]Value=;
cmdParametersAdd(p_contentOracleTypeBloblen);
cmdParameters[p_content]Value=tempBuff;//一个byte类型的数组
try
{
cmdExecuteNonQuery();
}
catch
{
//
}