Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。
写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?
这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。
看下面的JDBC的demo,把oraclejdbc.jar这个二进制文件写入数据库表javatest的content字段(这是一个blob型字段)
代码
- import java.sql.*;
- import java.io.*;
- import oracle.sql.*;
- public class WriteBlob {
- public static void main(String[] args) {
- try {
- DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver());
- Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl" , "fankai" , "fankai" );
- conn.setAutoCommit( false );
- BLOB blob = null ;
- PreparedStatement pstmt = conn.prepareStatement( "insert into javatest(name,content) values(?,empty_blob())" );
- pstmt.setString( 1 , "fankai" );
- pstmt.executeUpdate();
- pstmt.close();
- pstmt = conn.prepareStatement( "select content from javatest where name= ? for update" );
- pstmt.setString( 1 , "fankai" );
- ResultSet rset = pstmt.executeQuery();
- if (rset.next()) blob = (BLOB) rset.getBlob( 1 );
- String fileName = "oraclejdbc.jar" ;
- File f = new File(fileName);
- FileInputStream fin = new FileInputStream(f);
- System.out.println( "file size = " + fin.available());
- pstmt = conn.prepareStatement(