a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 125|回复: 1

[考试辅导] Oracle应用技术:Oracle中Blob字段的写入处理介绍

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
Oracle中的Bloc字段的措置较其他字段来说,会有一些非凡性。现就对在java和pl/sql下,Blob字段的措置和巨匠做一些交流。   下面,简单介绍一下Blob在以下两种情形中的写入措置,
0 @0 j3 g% W" t3 f# R  u      java情形
4 c/ ^. ^5 t/ }! a+ b+ f) i  u      PL/SQL情形
3 U1 A: V/ E; M0 G  一、java情形
" S) M* ]) h* I8 k; T  1、 Blob的插入操作
0 e) U, {- {+ g4 M  1)       插入一空的Blob。
$ e" H0 |) Q+ @+ {9 s# `  2)       更新该记载的Blob。
1 M! K2 `+ U% ^5 c  例子:
$ t4 {2 [+ c# q  好比表结构如下:
, u" D! K7 T( k  CREATE TABLE Student (
; ?: ^! ]3 f( L% r  Name VARCHAR2(30),
) G6 G5 J4 D; l) J% Z, N  Age   Int,: w* o5 e! J7 B* o! v% j; y/ e( g
  Picture    Blob);9 N8 z) T6 U0 @* Z9 R, k( y
  i.插入一空的Blob。+ K* N8 x0 ^+ U5 N3 S; t
  String command=”INSERT INTO Student VALUES(?,?,?)”;
) X/ _) j% u$ ?  Connection conn=null;. v* R7 ^6 B. B; M: ?1 o( p" [
  PreparedStatement ps=null;: I, ]7 |8 s4 i3 F$ Q8 J* x: t; m$ _
  try
' l/ A0 \. Y# Q+ t7 S7 F- t* u  {4 z! M  x  m4 S; Z5 ~
  conn=….;' k2 m' I/ L1 n, \* G* q
  ps=conn. prepareStatement(command);
7 o7 H0 J7 p0 M' z  ps.setString(1,”ZhangSan”);
2 O# Z: e4 V+ w0 p  ps.setInt(2,20);- F. M7 X; J; z7 w# T6 y
  ps.setBlob(3, BLOB.empty_lob());  \( ]- z1 b* X% }) R) K% r' _, p, d
  ps.executeUpdate();
2 r4 j9 Y3 l( S# L4 \( [  …9 E. S% b' H% |+ r' k
  ii.更新该记载1 t# {0 a* k$ }$ w1 z$ v, S
  …
, X6 v5 U/ n6 C4 w3 [* ^$ `* W' v: {  byte[] data=null;* p! ]( n$ L# b9 O+ N* v
  Connection conn=null;
5 H3 \) e, q7 T7 q9 P- P  Try
# X; o" M0 P$ F, r9 {) Y" @" D% d  {
8 h* q+ |' L; k4 v9 r) b  data=http://www.qnr.cn/pc/ora/jsfd/201007/…  //图片信息% O0 B1 ~  s" e  d4 u8 ~' g' u% b
  conn=..9 |0 O$ }- p- n, T
  ByteArrayInputStream in=new ByteArrayInputStream(data);# g2 R* R5 I/ E- |! a
  updateBlob(in, conn, “Student”,”Picture”,”Name”,”zhangsan”);8 i2 i( r1 r6 [" @7 \3 h2 i
  …
3 p. j) _! r* l, e! {2 x  …/ G7 D$ Q% T/ B$ A/ b- M. s
  public static void updateBlob(  InputStream instream,! D; s  Y! a/ d6 J9 b5 m8 l
  Connection conn,
# O+ _7 R0 ?" a( z# [  String table,
+ q& V$ p$ b- \  T  String blobColumn,
8 j' U0 {) j1 g; D  String keyColumn,( D' k: h1 e2 P
  String keyValue)4 _- Y- ~/ h/ ]* ~. a
  throws SQLException, IOException$ F3 u. P! w, \. }% E( j+ w3 k  w
  {
9 u* z% f$ o- w, B  Statement stmt = null;( W4 v/ o. n/ H0 l
  OracleResultSet rs = null;
) x/ c+ L% ]5 x" q% ]4 t  BLOB blob = null;
3 x4 S+ {  U' a1 u- i  boolean oldAutoCommit = conn.getAutoCommit();4 Y3 w0 O8 q! g6 N' _; A: M# E
  StringBuffer sqlBuffer = new StringBuffer();# }) b% X( q2 Y/ W, h( [
  try {
( O$ s) r% i. Q9 R  conn.setAutoCommit(false);
: E! H& e7 e& D0 ]- N  sqlBuffer.append("select ");
' s0 d  s: z. W1 n0 j/ b  sqlBuffer.append(blobColumn);5 _" H, P4 Y; I
  sqlBuffer.append(" from ");
4 V3 l2 S4 G8 y( o2 \( y) w  sqlBuffer.append(table);0 n0 I7 V# }! W+ Z
  sqlBuffer.append(" where ");
5 V1 z& b% C' E$ B  H- d  sqlBuffer.append(keyColumn);: b  I! J, e' u8 U; S: M) l# X$ {
  sqlBuffer.append("='");
" P7 }7 m9 C( C8 H# I  sqlBuffer.append(keyValue);
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle应用技术:Oracle中Blob字段的写入处理介绍

</p>  //注重这里的”for update”/ L2 x* g; d( O+ M: L; j, S
  sqlBuffer.append("' for update ");9 A* Y. @3 E. z/ c; u: x
  stmt = conn.createStatement();
# A0 ]+ h' l# a3 L  u# }  rs = (OracleResultSet) stmt.executeQuery(sqlBuffer.toString());) E: K1 x, b6 Y$ r( F  C0 ^
  if (!rs.next())
: m0 W0 Z) S: H  {  n6 V1 }# S5 M
  rs.close();5 `4 I9 u4 |/ Z2 ^% d1 A) a/ ~7 R! b
  stmt.close();
: W6 J# ~4 K3 P: ]7 J  throw new IllegalArgumentException(% k  F7 e; u; u. V' b
  "no record found for keyValue: '" + keyValue + "'");5 [$ E6 D5 m' B' ]0 I" i; n
  }: K4 b- I9 v& f5 a: U+ Z
  blob = rs.getBLOB(1);1 n7 Z- |) E7 f& K1 X) k
  OutputStream outstream = blob.getBinaryOutputStream();
# s! Y& ?+ T' @! [, \/ `' ]! i! Z  int bufferSize = blob.getChunkSize();1 H! R3 `2 a  H
  byte[] buffer = new byte[bufferSize];
: x3 K# k& \/ F9 P$ i: K  int bytesRead = -1;) z* A. {6 o6 t* i
  while ((bytesRead = instream.read(buffer)) != -1)1 {2 ]$ `9 K6 J) a0 D7 {6 n
  {
0 I: C* N4 X1 j) v  outstream.write(buffer, 0, bytesRead);# h; r8 G- u6 o$ g
  }7 m" a% @2 j1 ]% R4 a# H$ i
  instream.close();. w- I. M! U3 [& M, ~
  outstream.close();
& ]1 L& \+ N7 k; ~  rs.close();# Z' v6 M+ H: l. F8 U
  stmt.close();/ d: ^, P" n' q1 r
  }% [; B5 i: V- @# l) K
  catch (SQLException e)
0 J! C/ b& c0 B- G6 V0 Q' }  {
( _* I3 D& T" A  n  throw e;. y% W$ V; \+ g
  }
5 W' ^, \. I7 v  catch (IOException e)& i! ~$ j1 p9 P" J& R4 m+ p
  {
0 H- Y0 ]' Z4 O) Y5 ^  throw e;
1 E2 Q: c4 I8 O% }. h/ E  }
. q8 x- h* V' }. V  finally {/ M9 h" `' X: l1 v+ e+ ?+ u
  conn.setAutoCommit(oldAutoCommit);
# P0 h& X' ]4 v9 {! r9 g4 W! z4 g+ T  }
& A" e' c! e4 L- B/ \7 _2 H: \% @  }2 _. p" x4 D; e& J; f
  二、PL/SQL下
2 O; A8 T$ {- G! V4 k  (例子表结构如一所示)+ o8 [/ B4 d9 R  x% Z# ^4 f: N
  i.插入一空的Blob。. i$ u. c" x  Y
  …! }& V5 E/ I4 w+ p# c
  declare  C0 ?* E1 _0 M8 _! O7 ?
  bufferBlob BLOB;& M( `! g. H3 V  S( U& U8 o
  data        RAW(…)
) l7 S) ^+ j) b& @  …$ J5 R% O& K- T) m8 w6 m
  INSERT  INTO Student VALUES(‘zhangsan’, 20 , empty_blob() );/ u) [, U, H8 H1 K6 p6 Y
  …: }! @1 X$ L( Q' p- H8 Q( t8 |
  ii.更新该记载的Blob。# y. p0 u7 Z4 Y; o6 O  g+ @" J% Y
  …
6 e9 t% w6 V) a' n. q' p  SELECT Picture INTO bufferBlob FROM Student WHERE Name=’zhangsan’ FOR UPDATE;( _; \' g  H8 R
  DBMS_LOB.OPEN(bufferBlob , dbms_lob.lob_readwrite);
( @! l& Q0 [; `0 E  dbms_lob.write(bufferBlob , utl_raw.length(data) , data);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-28 08:15 , Processed in 0.373045 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表