Oracle数据库BLOB字段的存取

述】
    Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。
写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对
blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?
这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor
用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正地写入blob数据了。
【处理流程】

[sql] view plaincopyprint?

  1. --Oracle中的Lob类型示例表
  2. create table user_info
  3. (
  4. user_id number(10) primary key,
  5. name varchar2(20),
  6. image blob
  7. );
  8. --1. 插入空blob: (如果在数据库中采用默认值方式对Blob字段赋值, 此步可省略)
  9. insert into user_info values (1, ‘Jacky‘, empty_blob());
  10. --2. 获得blob的cursor:
  11. select image from user_info where user_id = ? for update;
  12. --3. 用cursor往数据库写数据:
  13. update user_info set image = ? where user_id = ?;
--Oracle中的Lob类型示例表

create table user_info
(
  user_id number(10) primary key,
  name varchar2(20),
  image blob
);

--1. 插入空blob: (如果在数据库中采用默认值方式对Blob字段赋值, 此步可省略)

   insert into user_info values (1, ‘Jacky‘, empty_blob());

--2. 获得blob的cursor:

   select image from user_info where user_id = ? for update;

--3. 用cursor往数据库写数据:

   update user_info set image = ? where user_id = ?;

 

//读取Blob数据   

  1. package demo;
  2. import java.sql.*;
  3. import java.io.*;
  4. public class ReadBlob
  5. {
  6. //加载驱动程序
  7. static
  8. {
  9. [java] view plaincopyprint?
    1. //读取Blob数据
    2. package demo;
    3. import java.sql.*;
    4. import java.io.*;
    5. public class ReadBlob
    6. {
    7. //加载驱动程序
    8. static
    9. {
    10. try
    11. {
    12. Class.forName("oracle.jdbc.driver.OracleDriver");
    13. } catch (ClassNotFoundException e)
    14. {
    15. // TODO Auto-generated catch block
    16. e.printStackTrace();
    17. }
    18. }
    19. public static void main(String[] args)
    20. {
    21. try
    22. {
    23. //1. 建立连接
    24. String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";
    25. Connection conn = DriverManager.getConnection(url,"scott","tiger");
    26. conn.setAutoCommit(false);
    27. //2. 查询数据
    28. String sql = "select image from user_info where user_id = 1";
    29. Statement stmt = conn.createStatement();
    30. ResultSet rs = stmt.executeQuery(sql);
    31. //3. 读取Blob类型数据
    32. Blob blob = null;
    33. if(rs.next())
    34. {
    35. blob = rs.getBlob(1);
    36. }
    37. byte[] temp = new byte[(int)blob.length()];
    38. InputStream in = blob.getBinaryStream();
    39. in.read(temp)s
    //读取Blob数据
    package demo;
    
    import java.sql.*;
    import java.io.*;
    
    public class ReadBlob
    {
    	//加载驱动程序
    	static
    	{
    
    		try
    		{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    		} catch (ClassNotFoundException e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	public static void main(String[] args)
    	{
    		try
    		{
    			//1. 建立连接
    			String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";
    			Connection conn = DriverManager.getConnection(url,"scott","tiger");
    			conn.setAutoCommit(false);
    
    			//2. 查询数据
    			String sql = "select image from user_info where user_id = 1";
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery(sql);
    
    			//3. 读取Blob类型数据
    			Blob blob = null;
    			if(rs.next())
    			{
    				blob = rs.getBlob(1);
    			}
    			byte[] temp = new byte[(int)blob.length()];
    			InputStream in = blob.getBinaryStream();
    			in.read(temp)s

    [java] view plaincopyprint?

    1. <strong>//保证文件名唯一,你可以用主键+时间啊等等方法</strong>
    2. File file = new File("D://img.bmp");
    3. FileOutputStream fout = new FileOutputStream(file);
    4. fout.write(temp);
    5. in.close();
    6. fout.close();
    7. } catch (Exception e)
    8. {
    9. // TODO Auto-generated catch block
    10. e.printStackTrace();
    11. }
    12. }
    13. }
    			//保证文件名唯一,你可以用主键+时间啊等等方法
    			File file = new File("D://img.bmp");
    			FileOutputStream fout = new FileOutputStream(file);
    			fout.write(temp);
    			in.close();
    			fout.close();
    		} catch (Exception e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }

//写Blob数据   

  1. package demo;
  2. import java.sql.*;
  3. import oracle.sql.BLOB;//▲此处的BLOB类全大写, 而java.sql.Blob中的Blob非全大写
  4. import java.io.*;
  5. public class WriteBlob
  6. {
  7. //加载驱动程序
  8. static
  9. {
  10. try
  11. {
  12. Class.forName("oracle.jdbc.driver.OracleDriver");
  13. }
  14. catch(Exception e)
  15. {
  16. e.printStackTrace();
  17. }
  18. }
  19. public static void main(String[] args)
  20. {
  21. try
  22. {
  23. //1. 建立与数据库服务器的连接
  24. String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";
  25. Connection conn = DriverManager.getConnection(url,"scott","tiger");
  26. conn.setAutoCommit(false);
  27. //2. 首先向表中插入空的Blob
  28. //★注意: 对于empty_blob()应放在SQL语句中直接赋值, 使用预置语句的方式赋值无法实现.
  29. String sql = "insert into user_info values(?,?,empty_blob())";
  30. PreparedStatement ps = conn.prepareStatement(sql);
  31. ps.setInt(1, 1);
  32. ps.setString(2, "Lucy");
  33. ps.executeUpdate();
  34. //3. 查询Blob, 获得Blob的Cursor
  35. sql = "select image from user_info where user_id = ?";
  36. ps = conn.prepareStatement(sql);
  37. ps.setInt(1, 1);
  38. ResultSet rs = ps.executeQuery();
  39. BLOB blob = null;
  40. if(rs.next())
  41. {
  42. blob = (BLOB)rs.getBlob(1);
  43. }
  44. //4. 使用字节流将待入库的文件写入到blob中
  45. File file = new File("D://iriver//sample1.bmp");
  46. FileInputStream fin = new FileInputStream(file);
  47. byte[] temp = new byte[fin.available()];
  48. fin.read(temp);
  49. OutputStream out = blob.getBinaryOutputStream();
  50. out.write(temp);
  51. fin.close();
  52. out.close();
  53. //5. 向数据库中写入数据
  54. sql = "update user_info set image = ? where user_id = ?";
  55. ps = conn.prepareStatement(sql);
  56. ps.setBlob(1, blob);
  57. ps.setInt(2, 1);
  58. ps.executeUpdate();
  59. conn.commit();
  60. } catch (Exception e)
  61. {
  62. e.printStackTrace();
  63. }
  64. }
  65. }
时间: 2024-10-24 07:18:56

Oracle数据库BLOB字段的存取的相关文章

JAVA读取Oracle数据库BLOB字段数据文件并保存到本地文件

******JAVA读取Oracle数据库BLOB字段数据文件并保存到本地文件****** package com.bo.test; import java.io.FileOutputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import

Java读取/更新Oracle数据库blob字段

在写java程序过程中,如何读取Oracle数据库表某类型为blob的字段? 以下是我在写程序的时候一种解决方法.核心语句.(传上来做了修改,格式不要学习,养成良好习惯) 详细请参考: 读取序列ID:http://blog.csdn.net/yzsind/article/details/6918506 BLOB相关:http://jslfl.iteye.com/blog/1771949 http://www.linuxidc.com/Linux/2011-08/40218.htm http://

对oracle数据库Blob字段的操作

java实体类 定义类型 byte[] private byte[] str_blob hibernate映射文件类型oracle.sql.BLOB <property name="str_blob" type="oracle.sql.BLOB"> <column name="STR_BLOB" /> </property> 数据库类型BLOB byte[] b = str.getBytes(); String

获取Oracle数据库中字段信息

select t.DATA_PRECISION,t.DATA_SCALE,t.DATA_LENGTH,t.DATA_TYPE,t.COLUMN_NAME, t.NULLABLE,t.DATA_DEFAULT,c.COMMENTS from all_tab_columns t left join all_col_comments c on t.table_name = c.table_name and t.column_name = c.column_name where t.table_name

向oracle的blob字段导入文件

在数据库主机上创建测试目录及文件 $mkdir /test $cd /test $echo "Test Subject" >> subject.html $echo "test ok !" >> mail.html 定义文件路径(都是数据库主机上的),并授权 $sqlplus user/[email protected] SQL>create or replace directory send_file_dir as '/test';

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法

binlog_format为row格式的时候记录的不是简单的sql,而是实际变更的行,一些大的DML操作,会导致binlog量增加很大,消耗额外的IO.网络资源 可以通过设置binlog_row_image=minimal解决 测试: binlog_row_image默认值是full 对user表进行update 进入binlog里面查看更新记录,binlog日志将所有影响的行都进行了记录 现在将binlog_row_image=minimal 对表中的行进行相同的update操作 再来观察下b

去掉Oracle数据库中字段值前后空格

发现oracle字段钟包含了空格,可能是前空格,也可能是后空格,因为是历史数据,需要特殊处理.但是中间的空格可能是一些特殊人员的姓名含有,这种情况不能处理.所以我们只需要处理前后空格即可.使用如下sql,即可解决. update t_pwm_bind set customer_nm = trim(customer_nm), crd_no = trim(crd_no), certif_id = trim(certif_id), phone_no = trim(phone_no) where cus

ORACLE 向BLOB字段中出入图片等二进制文件,使用Oracle SQl Developer工具

使用PL/SQL也可以 create directory "image" as 'e:\'; --"image" 要带双引号,网上很多不带的,我测试时出错,并且,'e:\'是服务器目录,非本地目录.需要给用户授权:grant create any directory to username; declare b_file bfile; b_lob blob; begin insert into TB_SJ(SJBM,SJMC,RKSJ,XGSJ,GSBM,SJDAT

把数据库blob字段用FoxitReaderSDK1显示PDF

procedure TAO_EWordPdf.ShowDoc;var   Adapter: iStream;//TStreamAdapter; DataLoader: TMemoryStream;begin if not cdsGetDocDOC_DATA.IsNull then   //判断数据字段不为空  begin DataLoader := TMemoryStream.Create();    DataLoader.Clear;    cdsGetDocDOC_DATA.SaveToSt