Oracleでblobタイプの読み取り
blobを使うことは多くないですが、インターネットで見るとちょっと乱れています。データからblobを読むのも見られません。ここでまとめます。
データベース内のテーブルステートメントは以下の通りです。
データベース内のテーブルステートメントは以下の通りです。
create table blogtest(id number primary key,name varchar2(20),picture blob);
package August;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleBlobTest {
public static void main(String[] args) {
}
public static void readBlob() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521/july", "scott",
"snaillocke");
Statement st = conn.createStatement();
PreparedStatement ps = conn.prepareStatement("select * from BLOBTEST where id = ?");
ps.setInt(1, 1);
ResultSet rs = ps.executeQuery();
rs.next();
oracle.sql.BLOB imgBlob = (oracle.sql.BLOB) rs.getBlob(3);
// BLOB
try{
FileOutputStream outStream = new FileOutputStream("D:/oracleback.png");
InputStream inStream = imgBlob.getBinaryStream();
byte[] buf = new byte[10240];
int len;
while ((len = inStream.read(buf)) > 0) {
outStream.write(buf, 0, len);
}
inStream.close();
outStream.close();
}catch(Exception e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void writeBlob() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521/july", "scott",
"snaillocke");
Statement st = conn.createStatement();
// empty_blob()
// , “for update”
PreparedStatement ps = conn.prepareStatement("insert into BLOBTEST (ID, NAME, PICTURE) values (1,'fang.jpg',?)");
// ORALCE.SQL.BLOB/CLOB.EMPTY_LOB() BLOB/CLOB
ps.setBlob(1, oracle.sql.BLOB.empty_lob());
ps.execute();
ps.close();
// BLOB/CLOB
ps = conn
.prepareStatement("SELECT * FROM BLOBTEST WHERE ID=? FOR UPDATE");
ps.setInt(1, 1);
ResultSet rs = ps.executeQuery();
rs.next();
oracle.sql.BLOB imgBlob = (oracle.sql.BLOB) rs.getBlob(3);
// BLOB
try{
FileInputStream inStream = new FileInputStream("D:/My Pictures/oracle.png");
OutputStream outStream = imgBlob.getBinaryOutputStream();
byte[] buf = new byte[10240];
int len;
while ((len = inStream.read(buf)) > 0) {
outStream.write(buf, 0, len);
}
inStream.close();
outStream.close();
}catch(Exception e) {
e.printStackTrace();
}
// Blob
ps = conn
.prepareStatement(" update BLOBTEST set PICTURE=?");
ps.setBlob(1, imgBlob);
ps.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
以上のコードはOracleドライバパッケージを導入しなければなりません。