Oracle中Blob和Clob的作用

Oracle中Blob和Clob的作用,第1张

BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。

1、用Blob和Clob建立对象

(1)在存储的时候也同样的在PreparedStatement和CallableStatememt中,以参数的形式使用setBlob()和 setClob方法把Blob和Clob对象作为参数传递给SQL。这听起来似乎很简单对吧,但是并非我们想象的这样,很不幸由于这两个类型的特殊,JDBC并没有提供独立于数据库驱动的Blob和Clob建立对象。因此需要自己编写与驱动有关的代码,但这样又牵掣到移植性。这就要用到前面说过的思想了使用数据块进行写 *** 作。

(2)同样用PreparedStatement和CallableStatememt类,但参数的设置可以换为setAsciiStream、setBinaryStream、setCharacterStream、setObject(当然前3个同样存在长度的问题)

(3)下面给大家个例子以方便大家理解:

public void insertFile(File f)  throws Exception{

FileInputStream fis=new FileInputStream(f,Connection conn);

byte[] buffer=new byte[1024]

data=null;

int sept=0;int len=0;

while((sept=fisread(buffer))!=-1){

if(data==null){

len=sept;

data=buffer;

}else{

byte[] temp;

int tempLength;

tempLength=len+sept;

temp=new byte[tempLength];

Systemarraycopy(data,0,temp,0,len);

Systemarraycopy(buffer,0,temp,len,sept);

data=temp;

len=tempLength;

}

if(len!=datalength()){

byte temp=new byte[len];

Systemarraycopy(data,0,temp,0,len);

data=temp;

}

}

String sql="insert into fileData (filename,blobData) value(,)";

PreparedStatement ps=connprepareStatement(sql);

pssetString(1,fgetName());

pssetObject(2,data);

psexecuteUpdate();

}

使用Microsoft SQL Server 存储和检索数据是一项与大多数应用程序相关的任务 在最近的一个项目中 我提出了一个新的交互手段——大数据类型或者 BLOB 项目必须存储和检索Microsoft Word 文档和图像文件 本文覆盖了使用 ADO NET 所完成任务的后台部分 后面将会有一期专栏讨论使用 ASP NET 的前台表现 什么是 BLOB? BLOB 是二进制大对象(binary large object)的首字母缩写 是在 SQL Server 中作为一个单一实体存储的二进制数据集合 BLOB 主要用于保存多媒体对象 比如图像 视频和声音 但是它们还可以存储程序 甚至是代码片断 虽然 SQL Server 支持 BLOB 但不是所有数据都支持 访问 BLOB 数据 有几种方法可以用来从 SQL Server 数据库读取数据 首先 你可以逐行读取数据 或者 你可以选择从特定列中读取数据 最简单的方法是访问特定的列 下面我们先讨论这种方法 读取 BLOB 数据要求工作在字节级 幸运的是 SqlDataReader 对象有一个 GetBytes 方法用于以字节方式访问一个列的数据 一旦字节被读取 它们就可以与一个 FileStream 对象组合 以将 BLOB 对象保存到一个文件中 下面的 C# 代码给出了这个例子 Byte[] blob = null;FileStream fs = null;const string sConn = server=(local);InitialCatalog=Northwind;UID=ctester;PWD=password ;try {SqlConnection conn = new SqlConnection(sConn);SqlCommand cmd = new SqlCommand( SELECT Picture FROM Categories WHERECategoryName= Builder conn);cn Open();SqlDataReader sdr = cmd ExecuteReader();sdr Read();blob = new Byte[(sdr GetBytes( null int MaxValue))];sdr GetBytes[ blob blob Length);sdr Close();conn Close();fs = new FileStream( c:\\Builder doc FileMode Create FileAccess Write);fs Write(blob blob Length);fs Close();} catch (SqlException e){Console WriteLine( SQL Exception: + e Message);} catch (Exception e) {Console WriteLine( Exception: + e Message);}这段代码从一个特定的数据单元(行和列的交叉点)中读取一个 BLOB 对象 注意 它(通过 Using 语句)使用了System Data SqlClient 和System IO 命名空间 FileStream 类的 Write 方法被用于将 BLOB 存储到一个本地驱动器中 在这种情况下 我们知道正在处理的是文档和图像文件 所以存储它们有意义 另外一种场景涉及到读取一个数据库记录行 这条记录中一个列是 BLOB 类型而其它列不是 SqlDataReader 对象的默认行为是 只要可以得到整行数据 就将传入数据以一行记录装载 BLOB 对象的大小使这个方法不兼容 所以它们很难对待 这可以通过SqlCommand 类的ExecuteReader 方法来完成 你可以将CommandBehavior SequentialAccess 传递给ExecuteReader 方法去修改SqlDataReader 的默认行为 以取代装载成行的数据 它将按其接收数据的顺序装载数据 使用SequentialAccess 的主要方面是知道字段被访问的顺序 SqlDataReader 的默认行为是允许你访问你想要访问的任何字段 但是SequentialAccess 使你以SqlDataReader 对象返回的顺序访问字段 数据被顺序读取 所以数据在被读取之后 它将不再可用 在访问 BLOB 字段的数据时 SqlDataReader 类的GetBytes GetString 和 GetChars 方法可以用来检索数据 GetBytes 和 GetChars 允许你使用 BLOB 字段的数据填充一个数组(它们都返回 long 型数值) 下面的代码展示了它们的使用方法 SqlConnection conn = null;SqlCommand cmd = null;SqlDataReader sdr = null;FileStream fs = null;BinaryWriter bw = null;long blob;byte[] outBuffer = new byte[ ];const string sConn = server=(local);InitialCatalog=Northwind;UID=ctester;PWD=password ;try {conn = new SqlConnection(sConn);cmd = new SqlCommand( SELECT CategoryID Picture FROM Categories WHERECategoryName= Builder conn);conn Open();sdr = cmd ExecuteReader(CommandBehavior SequentialAccess);while (sdr Read()) {id = sdr getString( );fs = new FileStream( c:\\Builder doc FileMode OpenOrCreate FileAccess Write);bw = new BinaryWriter(fs);blob = sdr GetBytes( startIndex outBuffer );while (blob == ) {bw Write(outBuffer);bw Flush();startIndex += ;bw Flush();bw Close();fs Close();}sdr Close();conn Close();} } 存储 BLOB 数据 检索和保存 BLOB 对象是一个很简单的过程 相反的过程 在 SQL Server 中存储 BLOB 对象 也一样简单 这里我要指出的是 前面的例子中使用了由这个例子中的代码存储到表中的 BLOB 数据(Builder doc) SqlConnection conn =null;SqlCommand cmd = null;SqlParameter param = null;FileStream fs = null;const string sConn = server=(local);InitialCatalog=Northwind;UID=ctester;PWD=password ;try {conn = new SqlConnection(sConn);cmd = new SqlCommand( UPDATE Categories SET Picture = @Picture WHERECategoryName = Seafood conn);fs = new FileStream( c:\\Builder doc FileMode Open FileAccess Read);Byte[] blob = new Byte[fs Length];fs Read(blob blob Length);fs Close();param = new SqlParameter( @Picture SqlDbType VarBinary blob Length ParameterDirection Input false null DataRowVersion Current blob);cmd Parameters Add(param);conn Open();cmd ExecuteNonQuery();} catch (SqlException e){Console Write( SQL Exception: + e Message());} catch (Exception e) {Console Write( Exception: e Message());}示例代码从本地文件系统插入一个 Word 文档到数据库中 它与常规的数据库更新 *** 作类似 然而 FileStream 和 Bytes 对象用于处理将 Word 文档插入到数据库中 另外一个变化是使用SqlParameter 对象将 BLOB 插入到数据库字段中 这就允许数据可以直接从内存写出到数据库中 不是所有的数据都是相等的 虽然字符串值是开发人员与数据库交互时最常用的数据类型 但是其它数据类型也经常使用 比如数字和 BLOB 在编程时 将将这些对象视为二进制流对待 lishixinzhi/Article/program/net/201311/13272

java blob是什么,让我们一起了解一下?

Blob是计算机视觉图像中的一块连通区域,Blob分析的就是对前景或背景分离后的二值图像,进行连通域提取和标记以及计算Blob的一些相关特征,而且通过Blob提取,还可以获得相关区域的信息。

Blob分析的重要一个步骤是连通区域的确定,那么它的优缺点是什么?

优点:

Blob在目标跟踪的优势有:

1、通过Blob提取,可以获得相关区域的信息,这些信息可以作为边缘监测器或者角点检测器的补充信息。在目标识别中,Blob可以提供局部的统计信息和外貌信息,这些信息能够为目标识别和跟踪提供依据。

2、可以利用Blob对直方图进行峰值检测。

3、Blob还可以作为纹理分析和纹理识别的基元。

4、通过Blob分析,可以得到目标的个数及其所在区域,在进行目标匹配时,不需要对全局图像进行搜索。

缺点:

1、速度过慢,要整个区域作逐点扫描。

2、Blob分析难度大。这是一纯几何学上的问题,一个不规则的形状,如何计算它的面积、大小没有简单易行的算法,太过复杂,运算时间就长,速度就更慢了。

3、实际应用。Blob算法在实际应用中,非常依赖光源。几乎可以说,Blob算法如果离开了一个可靠的光源设计,则完全不起作用。

那么java是怎样对Blob读写的?示例如下:

package comyousister;   import javaioBufferedInputStream; import javaioBufferedOutputStream; import javaioDataOutputStream; import javaioFile; import javaioFileInputStream; import javaioFileOutputStream; import javaioInputStream; import javasqlBlob; import javasqlConnection; import javasqlDriverManager; import javasqlPreparedStatement; import javasqlResultSet; import javautilProperties;   public class BlobTest {   public static Connection conn; public static Connection getConn() throws Exception { FileInputStream fis = new FileInputStream(new File("jdbcproperties")); Properties prop = new Properties(); propload(fis); String driver = propgetProperty("jdbcdriver"); String url = propgetProperty("jdbcurl"); String username = propgetProperty("jdbcusername"); String password = propgetProperty("jdbcpassword"); ClassforName(driver); return  DriverManagergetConnection(url, username, password); } public static void main(String[] args) throws Exception { conn = getConn(); readBlob(); writeBlob(); connclose(); } /  从数据库中读大对象出来  保存在本地 / public static void readBlob() { try { String readSql = "select  from emp where empno = "; PreparedStatement ps = connprepareStatement(readSql); pssetInt(1, 7369); ResultSet rs = psexecuteQuery(); while (rsnext()) { Blob image = rsgetBlob("image"); DataOutputStream dos =  // 在FileOutputStream中指定文件输出路径 new DataOutputStream(new FileOutputStream(7369 + "_imagejpeg")); InputStream fis = imagegetBinaryStream(); int out; byte[] outByte = new byte [100]; // 将blob对象输入流写入本地输出流中 while ((out = fisread(outByte)) != -1) { doswrite(outByte); } fisclose(); dosflush(); dosclose(); } rsclose(); psclose(); } catch (Exception e) { eprintStackTrace(); } } /  将大对象文件保存进数据库中 / public static void writeBlob() { try { BufferedInputStream fis =  new BufferedInputStream(new FileInputStream(new File("D:\\Tulipsjpg"))); // 如果是新插入字段,则将大对象对应字段插入为empty_clob(); // 如果是修改,则可以先update 该行数据,将大对象对应字段设置为empty_clob(); String writeSql = "select  from emp where empno =  for update"; PreparedStatement ps = connprepareStatement(writeSql); pssetInt(1, 7499); connsetAutoCommit(false); ResultSet rs = psexecuteQuery(); while (rsnext()) { oraclesqlBLOB image = (oraclesqlBLOB)rsgetBlob("image"); BufferedOutputStream bos = new BufferedOutputStream(imagegetBinaryOutputStream()); int c; // 将实际文件中的内容以二进制的形式来输出到blob对象对应的输出流中 while ((c = fisread()) != -1) { boswrite(c); } fisclose(); bosclose(); } conncommit(); rsclose(); psclose(); } catch (Exception e) { eprintStackTrace(); } } }

pingimg怎么下载

1、首先,打开手机上下载好的OurPlay,在首页的搜索栏中输入“Pinterest”,进入搜索结果的详情页,点击下载即可自动下载安装。

2、安装完成之后,打开软件,进入登录界面,输入邮箱点击“继续”便可自动注册,也可使用FaceBook账号和Google账号登录。

3、按照系统提示,选择自己喜欢的标签,便可在首页推送相关类别的美图。

4、选择自己喜欢的,点击此处隐藏选项,便可进行下载。快来下载喜欢的美图吧!

对象持久化,也就是可以把这个对象永远的保存起来,这里的保存不仅是对象本身,还包括他的属性和所依赖的其他类。通常,对象可以持久化到文件或者是数据库中。我这里只介绍如何将对象存储到数据库中。恰巧Oracle数据库为我们提供了这样的方便。

在Oracle中,有一种blog的字段类型,它是用来存储大量的二进制数据的。我们就利用这个字段去存储对象信息。

首先建立一个测试表:

create table TESTBLOB

(

NAME VARCHAR2(50) not null,

CONTENT BLOB not null,

ID NUMBER(8) not null

)alter table TESTBLOB

add constraint IDFORTEST primary key (ID);

只用三个字段,其中id是属性,content是我们要存储对象的字段。

先来看看我们要存入的对象:

import javaioSerializable;

import javautilDate;

import javautilList;

public class TestObject implements Serializable {

private static final long serialVersionUID = 4558876142427402513L;

/

@param args

/

private String name;

private String password;

private Date date;

private List<City> cityList;

public List<City> getCityList() {

return cityList;

}

public void setCityList(List<City> cityList) {

thiscityList = cityList;

}

public Date getDate() {

return date;

}

public void setDate(Date date) {

thisdate = date;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

thispassword = password;

}

}

记得要实现Serializable接口,可以看到这是一个包含了string,date,和list类型的对象,为了给测试增加复杂度,我们的list是另外一个对象(city)的list,如下:

import javaioSerializable;

public class City implements Serializable{

private static final long serialVersionUID = 4558876127402513L;

private String name;

private String code;

public String getCode() {

return code;

}

public void setCode(String code) {

thiscode = code;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

}

City对象包括了城市名称和区号。下面是主要的应用了。

import javaioBufferedInputStream;

import javaioByteArrayInputStream;

import javaioByteArrayOutputStream;

import javaioInputStream;

import javaioObjectInputStream;

import javaioObjectOutputStream;

import javaioOutputStream;

import javasqlConnection;

import javasqlDriverManager;

import javasqlResultSet;

import javasqlStatement;

import javautilArrayList;

import javautilDate;

import javautilList;

import oraclesqlBLOB;

public class Test {

public static void main(String[] args) {

//创建测试用对象

City beijing = new City();

beijingsetName("北京");

beijingsetCode("010");

City shanghai = new City();

shanghaisetName("上海");

shanghaisetCode("020");

City tianjin = new City();

tianjinsetName("天津");

tianjinsetCode("021");

List<City> cityList = new ArrayList<City>();

cityListadd(beijing);

cityListadd(shanghai);

cityListadd(tianjin);

TestObject obj = new TestObject();

objsetName("yangsq");

objsetPassword("111");

objsetDate(new Date());

objsetCityList(cityList);

try{

//将对象存入blob字段

ByteArrayOutputStream byteOut=new ByteArrayOutputStream();

ObjectOutputStream outObj=new ObjectOutputStream(byteOut);

outObjwriteObject(obj) ;

final byte[] objbytes=byteOuttoByteArray();

ClassforName("oraclejdbcdriverOracleDriver");

Connection con = DriverManagergetConnection(

"jdbc:oracle:thin:@:1521:", "yangsq", "yangsq");

consetAutoCommit(false);

Statement st = concreateStatement();

stexecuteUpdate("insert into TESTBLOB (ID, NAME, CONTENT) values (1, 'test1', empty_blob())");

ResultSet rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1 for update");

if (rsnext()) {

BLOB blob = (BLOB) rsgetBlob("CONTENT");

OutputStream outStream = blobgetBinaryOutputStream();

outStreamwrite(objbytes, 0, objbyteslength);

outStreamflush();

outStreamclose();

}

byteOutclose();

outObjclose();

concommit();

//取出blob字段中的对象,并恢复

rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1");

BLOB inblob = null;

if (rsnext()) {

inblob = (BLOB) rsgetBlob("CONTENT");

}

InputStream is = inblobgetBinaryStream();

BufferedInputStream input = new BufferedInputStream(is);

byte[] buff = new byte[inblobgetBufferSize()];

while(-1 != (inputread(buff, 0, bufflength)));

ObjectInputStream in =

new ObjectInputStream(

new ByteArrayInputStream(

buff));

TestObject w3 = (TestObject)inreadObject();

Systemoutprintln(w3getName());

Systemoutprintln(w3getPassword());

Systemoutprintln(w3getDate());

List<City> list = w3getCityList();

for(City city : list){

Systemoutprintln(citygetName() + " " + citygetCode());

}

stclose();

conclose();

} catch (Exception ex) {

exprintStackTrace();

Systemexit(1);

}

}

}

代码的蓝色部分创建了要存储的对象。再看红色的对象写入部分,它首先把对象转化成二进制流的形式。对于blob字段,我们不能简单的在insert时插入,实际上,insert时,对于blob字段,只能先插入一个空的blob对象empty_blob(),然后再进行"select CONTENT from TESTBLOB where ID=1 for update"对blob字段进行更新。返回后,我们只要把对象的二进制流写入即可。

OutputStream outStream = blobgetBinaryOutputStream();

outStreamwrite(objbytes, 0, objbyteslength);

需要注意的是,上述步骤必须设置consetAutoCommit(false),否则oracle会抛出异常。

接下来,绿色的代码是读取数据库中blob字段的对象,并恢复。我们要知道的是,所有对blob字段的 *** 作都是二进制的,即插入时是二进制流,读出时也是二进制流。然后用io修饰器(ObjectInputStream)去修饰。以前学习java时,感觉它的io好繁琐啊,现在感觉还真是各有其用。下面是测试的输出结果。

yangsq

111

Tue Mar 27 12:11:28 CST 2007

北京 010

上海 020

天津 021

需要说明一下,buff的size一定要足够大,否则将抛出异常。在这里,我使用的是inblobgetBufferSize()来设置buff的size,这并不是一种好的方法,因为一般inblobgetBufferSize()都是32768,很可能出现异常,所以这个size最好自己设置,或系统运行时刻设置(幸好java提供数组长度的运行时刻设置)。

以上就是关于Oracle中Blob和Clob的作用全部的内容,包括:Oracle中Blob和Clob的作用、使用ADO.NET 和C# 处理BLOB 数据、java blob等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10108750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存