数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

向Oracle数据库blob图片字段写入图片流


发布日期:2018年03月07日
 
向Oracle数据库blob图片字段写入图片流

资料一

//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

{

//

}

               

上一篇:Oracle数据库10g第2版终于破茧而出

下一篇:Oracle应用集成架构不断实现创新