知识大全 向Oracle数据库blob图片字段写入图片流
Posted 知
篇首语:少年辛苦终身事,莫向光阴惰寸功。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 向Oracle数据库blob图片字段写入图片流相关的知识,希望对你有一定的参考价值。
向Oracle数据库blob图片字段写入图片流 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
资料一
// 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目录下的Azul jpg存入到utl_lob_test
表中的blob_column字段中了
declare
a_blob BLOB;
a_bfile BFILE := BFILENAME( UTLLOBDIR Azul jpg );
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_lob fileopen(a_bfile);
dbms_lob loadfromfile(a_blob a_bfile dbms_lob getlength(a_bfile));
dbms_lob fileclose(a_bfile);
mit;
end;
/
资料二
ORACLE中LOB字段的使用和维护
摘要 本文通过实例介绍了在ORACLE数据库中通过DBMS_LOB包使用和维护LOB数据类型的基本方法
关键词 ORACLE DBMS_LOB LOB 维护
中图分类号 TP
引言
随着社会的发展 在现代信息系统的开发中 需要存储的已不仅仅是简单的文字信息 同时还包括一些图片和音像资料或者是超长的文本 比如开发一套旅游信息系统 每一个景点都有丰富的图片 音像资料和大量的文字介绍 这就要求后台数据库要有存储这些数据的能力 ORACLE公司在其Oracle i中通过提供LOB字段实现了该功能
为了便于读者的理解 我们先介绍一些基本的概念
在ORACLE数据库中 LOB(Large Objects—大对象)是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达 GB的数据) 目前 它又分为两种类型 内部LOB和外部LOB 内部LOB将数据以字节流的形式存储在数据库的内部 因而 内部LOB的许多操作都可以参与事务 也可以像处理普通数据一样对其进行备份和恢复操作 Oracle i支持三种类型的内部LOB BLOB(二进制数据) CLOB(单字节字符数据) NCLOB(多字节国家字符数据) 其中CLOB和NCLOB类型适用于存储超长的文本数据 BLOB字段适用于存储大量的二进制数据 如图像 视频 音频等 目前 Oracle i只支持一种外部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 中写入数据
PARE() 比较两个同种数据类型的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_lob write(lobloc amount buffer);
MIT;
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_lob read(lobloc amount offset buffer); 读取数据到缓冲区
dbms_output put_line(buffer); 显示缓冲区中的数据
MIT;
END;
/
资料三 java实现
Java代码
import java sql *;
import java io *;
import java util *;
// Importing the Oracle Jdbc driver package makes the code more readable
import oracle jdbc driver *;
//needed for new CLOB and BLOB classes
import oracle sql *;
public class LobExample
public static void main (String args [])
throws Exception
// Register the Oracle JDBC driver
DriverManager registerDriver(new oracle jdbc driver OracleDriver());
// Connect to the database
// You can put a database name after the @ sign in the connection URL
Connection conn =
DriverManager getConnection ( jdbc:oracle:oci :@ scott tiger );
// It s faster when auto mit is off
conn setAutoCommit (false);
// Create a Statement
Statement stmt = conn createStatement ();
try
stmt execute ( 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
stmt execute ( create table basic_lob_table (x varchar ( ) b blob c clob) );
// Populate the table
stmt execute ( insert into basic_lob_table values ( one oneothreefour ) );
stmt execute ( insert into basic_lob_table values ( o othreefourfivesix ) );
System out println ( Dumping lobs );
// Select the lobs
ResultSet rset = stmt executeQuery ( select * from basic_lob_table );
while (rset next ())
// 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 );
System out println ( Dumping lobs again );
rset = stmt executeQuery ( select * from basic_lob_table );
while (rset next ())
// 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
rset close();
stmt close();
conn close();
// Utility function to dump Clob contents
static void dumpClob (Connection conn CLOB clob)
throws Exception
// get character stream to retrieve clob data
Reader instream = clob getCharacterStream();
// create temporary buffer for read
char[] buffer = new char[ ];
// length of characters read
int length = ;
// fetch data
while ((length = instream read(buffer)) != )
System out print( Read + length + chars: );
for (int i= ; i<length; i++)
System out print(buffer[i]);
System out println();
// Close input stream
instream close();
// 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 = blob getBinaryStream();
// Create temporary buffer for read
byte[] buffer = new byte[ ];
// length of bytes read
int length = ;
// Fetch data
while ((length = instream read(buffer)) != )
System out print( Read + length + bytes: );
for (int i= ; i<length; i++)
System out print(buffer[i]+ );
System out println();
// Close input stream
instream close();
// Utility function to put data in a Clob
static void fillClob (Connection conn CLOB clob long length)
throws Exception
Writer outstream = clob getCharacterOutputStream();
int i = ;
int chunk = ;
while (i < length)
outstream write(i + hello world chunk);
i += chunk;
if (length i < chunk)
chunk = (int) length i;
outstream close();
// Utility function to put data in a Blob
static void fillBlob (Connection conn BLOB blob long length)
throws Exception
OutputStream outstream = blob getBinaryOutputStream();
int i = ;
int chunk = ;
byte [] data = ;
while (i < length)
data [ ] = (byte)i;
outstream write(data chunk);
i += chunk;
if (length i < chunk)
chunk = (int) length i;
outstream close();
给你这个例子看看 一看就明白了
资料四 C#实现
比如
FileStream fs=File OpenRead(path);
long len=fs Length;
byte[] tempBuff= new byte[len];
fs Read(tempBuff Convert ToInt (len));
fs Close();
OracleConnection conn=new OracleConnection( );
conn Open();
OracleCommand cmd=conn CreateCommand();
cmd CommandText=SpName;//存储过程名
cmd CommandType=CommandType StoredProcedure;
cmd Parameters Add( p_filename OracleType Varchar );
cmd Parameters[ p_filename ] Value= ;
cmd Parameters Add( p_content OracleType Blob len);
cmd Parameters[ p_content ] Value=tempBuff;//一个byte类型的数组
try
cmd ExecuteNonQuery();
catch
//
cha138/Article/program/Oracle/201311/18734相关参考
首先创建水晶报表rpt文件方法还是采用xsd数据集的方式简便容易操作记得将数据集中的相关字段设为你想要在报表中呈现的字段比如说在内容左边加入一个图片就将相应的图片字段拖放过去能不能直接在水晶报表上
将Image图像文件存入到数据库中我们知道数据库里的Image类型的数据是二进制数据因此必须将图像文件转换成字节数组才能存入数据库中 &nbs
解决API缓冲写屏幕时无法写入图片文字 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Situa
知识大全 JDBC+Hibernate将Blob数据写入Oracle
JDBC+Hibernate将Blob数据写入Oracle 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
Asp.net把图片存入数据库和读取图片的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 网
Oracle用户数据字典以及查询表字段 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 查看当前用
知识大全 Oracle数据字典(可用它动态获取字段名、长度、类型等)
Oracle数据字典(可用它动态获取字段名、长度、类型等) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
知识大全 servlet实现从oracle数据库的blob字段中读出文件并显示
/* *ReadFilejava * *Createdon年月日下午: */ packagejgwlapp; importjavaio*;import*
(这几天做了个小小课程设计时用的是oracle数据库第一次用发现oracle和我们以前用的sqlservermysql是有如此多不同的地方下面是遇到的问题之一和解决方法和大家分享下) 用惯sql
因为业务需要修要修改某个字段数据类型有number()变为number()型 要是没有数据的话直接用以下语句即可 alter tabletb_testmodifyperm