`
seandeng888
  • 浏览: 158111 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Oracle blob类型学习

阅读更多

    BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。

    在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。

BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。

    但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序BLOB的典型例子。

1       Oracle存储过程中插入图片

    要在oracle里面存入图片 blob类型,首先在数据库里建立:

--连接到管理员
conn sys/tbsoft as sysdba;

--scott用户授权

grant create any directory to scott;

--回到scott用户

conn scott/tiger;

--创建存储图片的表
CREATE TABLE IMAGE_LOB (T_ID VARCHAR2 (5) NOT NULL,T_IMAGE BLOB NOT NULL);

--创建存储图片的目录
CREATE OR REPLACE DIRECTORY IMAGES AS 'C:\picture';

--c:下自己建一个叫picture的文件夹

CREATE OR REPLACE PROCEDURE IMG_INSERT (TID VARCHAR2,FILENAME VARCHAR2) AS
F_LOB BFILE;--
文件类型
B_LOB BLOB;
BEGIN
INSERT INTO IMAGE_LOB (T_ID, T_IMAGE)
VALUES (TID,EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB;
--
插入空的blob
F_LOB:= BFILENAME ('IMAGES', FILENAME);
--
获取指定目录下的文件
DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONLY);
--
以只读的方式打开文件
DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB,DBMS_LOB.GETLENGTH (F_LOB));
--
传递对象
DBMS_LOB.FILECLOSE (F_LOB);
--
关闭原始文件
COMMIT;
END;
/

--C:\picture下放一张图片1.gif

--将该图片存入表
call IMG_INSERT('1','1.gif');

2  JAVA显示Oracle图片

JAVA关键代码如下:
BufferedInputStream ins;//
取得BLOBIO 
byte[] bt = null; 
Blob bo = null; 
PreparedStatement ps = null; 
ResultSet rs = null; 
String sql = "select T_IMAGE from IMAGE_LOB where t_id=?"; 

ps = conn.prepareStatement(sql); 
ps.setString(1, imgname); 
rs = ps.executeQuery(); 
if (rs.next()) { 
  bo = rs.getBlob("T_IMAGE"); 
  try { 
    ins=new BufferedInputStream(bo.getBinaryStream());
    int bufferSize = (int) bo.length();//
取得BLOB的长度
   bt = new byte[bufferSize];
   try {
    ins.read(bt, 0, bufferSize);
   } catch (IOException e) {
    e.printStackTrace();
   }
   //
建立字节缓存 
  } catch (SQLException e) {
   e.printStackTrace(); 
  } 
}
return bt;

action里面调用getImage()方法并显示图片在页面上,如下:

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { 
   BlobDAO blobDAO = BlobDAO.getInstance(); 
   byte[] bs = blobDAO.getImage("1"); 
   try { 
     response.getOutputStream().write(bs); 
   } catch (IOException e) { 
     e.printStackTrace(); 
   }
   return null; 
}

3       JAVA添加图片到Oracle

(请在c盘下放入图片--c:\\4.gif),JAVA关键代码如下:如下:

Statement st = null;
BLOB blob = null; //
图片类型
OutputStream outputStream = null; //
输出流
File file = null; //
文件
InputStream inputStream = null; //
输入流
ResultSet rs = null;

conn.setAutoCommit(false); //事物由程序员操作
st = conn.createStatement();
st.executeQuery("insert into IMAGE_LOB values('"+ imgId +"',empty_blob())");
rs = st.executeQuery("select T_IMAGE from IMAGE_LOB where t_id='"+ imgId +"' for update");
if (rs.next()) {
  blob = (BLOB) rs.getBlob(1);
  outputStream = blob.getBinaryOutputStream();
  file = new File("c:\\4.gif");
  inputStream = new FileInputStream(file);
  byte[] b = new byte[blob.getBufferSize()];
  int len = 0;
  while ((len = inputStream.read(b)) != -1) {
    System.out.println(len);
    outputStream.write(b, 0, len);
  }
}

4       DBMS_LOB包的使用

1dbms_lob.append(dest_lob IN OUT NOCOPY BLOB, src_lob IN BLOB)

  dbms_lob.append(dest_lob IN OUT NOCOPY CLOB CHARACTER SET ANY_CS, src_lob  IN CLOB CHRACTER SET dest_lob%CHARSET);

 将源LOB变量的内容添加到目标LOB变量的尾部。

 示例:dest_lob clob;

       src_lob clob;

       dbms_lob.append(dest_lob,src_lob);

2 dbms_lob.close(lob_loc IN OUT NOCOPY BLOB/CLOB/BFILE)

关闭已经打开的LOB

3 dbms_lob.compare(

lob_1 IN BLOB/CLOB/BFILE,

lob_2 IN BLOB/CLOB/BFILE,

amount IN INTEGER:=4294967295,--要比较的字符数(CLOB),字节数(BLOB)

offset_1 IN INTEGER:=1,--lob_1的起始位置

offset_2 IN INTEGER:=1--lob_2的起始位置)

  比较两个LOB的内容。

4dbms_lob.copy(

dest_lob IN OUT NOCOPY BLOB/CLOB/NCLOB,

src_lob IN BLOB/CLOB/NCOB,

amount IN INTEGER,

dest_offset IN INTEGER:=1,

src_offset IN INTEGER:=1)

  src_lob中,以src_offset为起始位置,截取amount个字符/字节,放到dest_lobdest_offset位置。

5dbms_lob.createtemporary(

lob_loc IN OUT NOCOPY BLOB/DLOB/NCLOB,

cache IN BOOLEAN,

dur IN PLS_INTEGER:=10)

  在用户的临时表空间中,建立临时LOB

  lob_loc:指定LOB定位符。

  Cache:是否将LOB读取到缓冲区。

  Dur:指定何时清除临时LOB10:会话结束时。12:调用结束时)。

6dbms_lob.erase(

lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,

amount IN OUT NOCOPY INTEGER,--字符/字节数

offset IN INTEGER:=1—起始位置

)

  删除LOB变量的内容。

7dbms_lob.fileclose(file_loc IN OUT NOCOPY BFILE)

关闭打开的BFILE定位符所指向的OS文件

8dbms_lob.filecloseall关闭当前会话已经打开的所有BFILE文件。

9dbms_lob.fileexists(file_loc IN BFILE) RETURN INTEGER

确定file_loc对应的OS文件是否存在,1:存在。0:不存在。

10dbms_lob.filegetname(

file_loc IN BFILE,

dir_alias OUT varchar2,

filename OUT varchar2)

    获取BFILE定位符所对应的目录别名和文件名。

11dbms_lob.fileisopen(file_loc IN BFILE) RETURN INTEGER

确定BFILE对应的OS文件是否打开。

12dbms_lob.freetemporary(lob_lob IN OUT NOCOPY BLOB/CLOB/NCLOB)

释放在默认临时表空间中的临时LOB

13dbms_lob.fileopen(file_loc IN OUT NOCOPY BFILE,

Open_mode IN BINARY_INTEGER:file_readonly)

打开文件。

14dbms_lob.getchunksize(lob_loc IN BLOB/CLOB/NCLOB) RETURN INTEGER

当建立包含CLOB/BLOB列的表时,通过指定CHUNK参数可以指定操纵LOB需要分配的字节数(数据库尺寸的整数倍)默认为数据块的尺寸。

15dbms_lob.getlength(lob_loc IN BLOB/CLOB/BFILE/NCLOB) RETURN INTEGER

获取长度。

16dbms_lob.instr(

Lob_loc IN BLOB/CLOB/NCLOB/BFILE,

Pattern IN RAW/VARCHAR2,

Offset IN INTERGER:=1,

Nth  IN INTEGER:=1) RETURN INTEGER

  返回特定样式数据从LOB某偏移位置开始出现N次的具体位置。

17dbms_lob.idopen(lob_loc IN BLOB/CLOB/BFILE) RETURN INT

确定LOB是否打开,打开:1,未打开:0

18dbms_lob.istemporary(lob_loc IN BLOB/CLOB/NCLOB) RETURN INTEGER

确定定位符是否为临时LOB

19dbms_lob.loadfromfile(

dest_lob IN OUT NOCOPY BLOB/CLOB,

src_file IN FILE,

amount IN INTEGER,

dest_offset IN INTEGER:=1,

src_offset IN INTEGER:=1)

  BFILE的部分或全部内容复制到目标LOB变量。

20dbms_lob.loadblobfromfile(

dest_lob IN OUT NOCOPY BLOB,

src_bfile IN BFILE,

amount IN INTEGER,

dest_offset IN OUT INTEGER,

src_offset IN OUT INTEGER)

BFILE数据装载到BLOB中,并且在装载后取得最新的偏移位置。

21dbms_lob.open(

lob_loc IN OUT NOCOPY BLOB/CLOB/BFILE,

open_mode IN BINARY_INTEGER)

打开LOBopen_mode(只读:dbms_lob.lob_readonly,读写:dbms_lob.lob_readwrite.

22dbms_lob.read(

lob_loc IN BLOB/CLOB/BFILE,

amount IN OUT NOCOPY BINARY_INTEGER),--IN:要读取的字符数,

OUT:实际读取的字符数。

Offset IN INTEGER,

Buffer OUT RAW/VARCHAR2—存储数据的变量

)

LOB数据读取到缓存区中(变量中)。

23dbms_lob.substr(

Lob_loc IN BLOB/CLOB/BFILE,

Amount IN INTEGER:=32762,

Offset IN INTEGER:=1) RETURN RAW/VARCHAR2

与字符处理函数SUBSTR()使用方法一样。

24dbms_lob.trim(

Lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,

Newlen IN INTEGER)

截断LOB到指定长度。

25dbms_lob.write(

Lob_loc IN OUT NOCOPY BLOB/CLOB,

Amount IN BINARY_INTEGER,

Offset IN INTEGER,

Buffer IN RAW/VARCHAR2)

将缓冲区数据写入到LOB中的特定位置。

26dbms_lob.writeappend(

Lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,

Amount IN BINARY_INTEGER,

Buffer IN RAW/VARCHAR2)

 

   将缓冲区数据写到LOB尾部。

分享到:
评论

相关推荐

    oracle Blob转换Clob

    - **Blob (Binary Large Object)**:在Oracle数据库中,Blob类型用于存储大量的二进制数据,如图像、视频或文档等非结构化数据。 - **Clob (Character Large Object)**:Clob类型用于存储大量的文本数据,比如文章、...

    批量导出ORACLE数据库BLOB字段生成文件

    Oracle数据库是全球广泛使用的大型企业级数据库管理系统,它支持多种数据类型,包括BLOB(Binary Large Object),用于存储图像、文档等二进制大对象。本教程将详细讲解如何批量导出Oracle数据库中的BLOB字段并生成...

    blob_oracle.rar_blob_blob oracle_c++ oracle blob_oracle_oracle

    总之,Oracle的BLOB类型提供了处理大量二进制数据的能力,而C++的OCI库为开发者提供了强大的工具,使得在应用程序中存储和检索这些数据变得可能。通过学习和理解上述知识点,你可以有效地管理Oracle数据库中的大型二...

    Oracle照片导出

    Oracle照片导出是一款基于C#开发的工具,主要用于从Oracle数据库中导出Blob类型的图片数据。Blob(Binary Large Object)是Oracle数据库用于存储大对象,如图像、音频或视频文件等非结构化数据的数据类型。这个工具...

    c#Blob字段的word文档在oracle上下载、上传

    c#-操作数据库oracle的小代码,提供用于学习。代码主要实现从oracle下载、上传blob字段的word文件的功能,使用了Oracle.DataAccess.dll,想了解相关知识的欢迎下载,有问题的请给我留言,谢谢。

    向orcale数据库中插入blob类型的数据,插入一张图片的示例

    向orcale数据库中插入blob类型的数据,插入一张图片的示例,由于本人在完成时遇到了很多问题,最终解决了,于是整理下来,方便学习交流

    使用JDBC和Hibernate来写入Blob型数据到Oracle中

    BLOB类型用于存储非结构化的二进制数据,如图片、音频文件或大型文本文件。本教程将深入探讨如何利用Java的JDBC(Java Database Connectivity)和ORM框架Hibernate来处理Oracle数据库中的Blob型数据。 首先,我们...

    java实现 BLOB图片大文件在oracle中的存储和查找

    首先,我们需要理解BLOB类型。BLOB是Oracle数据库中用于存储二进制大数据的一种数据类型,非常适合存储图像、音频或视频等非结构化数据。在Java中,我们通常使用`PreparedStatement`和`ResultSet`接口来操作BLOB字段...

    一个关于更新Oracle中Blob问题

    在Oracle数据库中,Blob(Binary Large Object)类型用于存储大对象数据,如图像、音频或视频文件等。本文将深入探讨在更新Oracle数据库中的Blob字段时遇到的问题,以及如何通过编程方式解决这些问题。我们将主要...

    clob-blob.rar_blob and clob_clob_java CLOB_java oracle cl_oracle

    对于CLOB和BLOB字段,Oracle JDBC驱动提供了`oracle.jdbc.driver.OracleClob`和`oracle.jdbc.driver.OracleBlob`类,它们实现了Java的标准接口`java.sql.Clob`和`java.sql.Blob`。这两个接口提供了读取和写入大数据...

    oracle学习实用脚本

    1. **数据类型.txt**:文件介绍了Oracle数据库中的各种数据类型,如NUMBER、VARCHAR2、DATE、BLOB等,理解数据类型对于创建表结构和处理数据至关重要。 2. **PLSQL基本.txt**:PL/SQL是Oracle特有的编程语言,用于...

    Oracle数据库整理学习手册

    其中特别指出BLOB类型的使用应当谨慎,因为它主要用于存储大对象,可能会影响性能。 #### 十、数据操作 (DML) - **插入多条数据**:可以通过`INSERT INTO 表名 (列...) SELECT 列... FROM 表`的方式批量插入数据。 ...

    学习Oracle实用教程04章Oracle数据类型和函数.pdf

    在学习Oracle时,理解并掌握数据类型和函数是至关重要的基础。本章主要探讨Oracle中的数据类型,包括概述、字符数据类型、数值数据类型、日期类型以及其他特殊类型。 4.1.1 数据类型的概述 数据类型是数据库中用于...

    Oracle数据库学习ppt资料

    Oracle支持多种数据类型,如数值类型、字符串类型、日期时间类型以及BLOB、CLOB等大型对象类型。约束是保证数据完整性的一种方式,包括NOT NULL、UNIQUE、PRIMARY KEY和FOREIGN KEY等。索引可以加速数据查询,有B树...

    Oracle 数据类型及存储方式.pdf

    LOB数据类型包括CLOB、NCLOB和BLOB等,用于存储大文本或二进制数据。这些数据类型可以存储大到数GB的数据,适合存储大量的文本、图像、视频等多媒体数据。LOB数据通常不直接存储在表中,而是存储在专门的区域,表中...

    c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库

    Blob(Binary Large Object)字段类型用于存储大量的二进制数据,如图片、文档等。 首先,确保已安装了Oracle的客户端库,如ODP.NET Managed Driver,它是Oracle官方提供的.NET数据访问组件,可以方便地在C#中连接...

    oracle教程--深入浅出oracle学习资料

    在Oracle中,数据类型包括基本类型(如NUMBER、VARCHAR2、DATE等)和复杂类型(如BLOB、CLOB、NCLOB、BFILE等)。创建表是数据库设计的重要环节,定义字段、数据类型、主键、外键等约束。索引则可以显著提升查询性能...

    Oracle数据类型详解

    在Oracle 10g这个版本中,数据类型是构建数据库结构的基础,它们定义了存储在表中的数据的格式和特性。理解Oracle数据类型对于数据库设计、开发和管理至关重要。以下是Oracle 10g中数据类型的详细讲解: 1. **数值...

    dbImages读取数据库的BLOB

    本篇文章将深入探讨如何使用CdbImage类来读取Oracle数据库中的BLOB类型数据,以及如何将这些数据转换为图片文件。 首先,`CdbImage`是一个自定义的类,设计用于处理数据库中的BLOB数据,特别是图像数据。这个类通常...

Global site tag (gtag.js) - Google Analytics