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尾部。

猜你喜欢

转载自seandeng888.iteye.com/blog/2105117