a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 112|回复: 1

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
Oracle中的Bloc字段的措置较其他字段来说,会有一些非凡性。现就对在java和pl/sql下,Blob字段的措置和巨匠做一些交流。   下面,简单介绍一下Blob在以下两种情形中的写入措置,
& @: T8 l+ [4 e% \: y; L  u      java情形
' I1 T4 G* R" V7 J  u      PL/SQL情形
/ \5 \! \( S7 L; }  一、java情形" ]: U3 j0 ^( Z8 q" B. j
  1、 Blob的插入操作
0 F, P, z. e' x: f+ R  1)       插入一空的Blob。
6 @! c, X% N  y) l  2)       更新该记载的Blob。
# A! @" W, H! ]. `) b  例子:+ c. q0 r4 u+ j9 d% }1 I
  好比表结构如下:
# m  v: R7 X4 N' F6 r& F0 F  CREATE TABLE Student (
3 V2 H& H) B+ k, X9 ?3 T  Name VARCHAR2(30),
& d/ d  f: b: D0 m7 R2 _  Age   Int,1 B( l& C# Q4 D
  Picture    Blob);, V" C: n% O+ x; o. u# B7 u
  i.插入一空的Blob。
2 g2 N0 \9 C/ a7 ~  String command=”INSERT INTO Student VALUES(?,?,?)”;, U9 O( |* n" M7 O
  Connection conn=null;/ f, H- C, B' l; X2 t
  PreparedStatement ps=null;
# J, v) Y4 |7 V/ g' _  I8 ^  try
- M3 B( c: K* |. w" H" z  {4 A+ s6 ^* J3 a6 y
  conn=….;
/ e) l4 d; q5 S# K  ps=conn. prepareStatement(command);
+ f. d2 u0 _5 v2 f  E8 L  ps.setString(1,”ZhangSan”);
% W' g3 |: Q/ d) q  ps.setInt(2,20);& M3 }: L+ ~% E2 G5 S
  ps.setBlob(3, BLOB.empty_lob());9 c; W  N2 ]: ~
  ps.executeUpdate();4 ^% @2 i( K% S1 q: S+ `
  …
! s! y$ t& d3 j' V+ g  ii.更新该记载
0 ^) |: ~( |* b7 q/ N2 |8 r9 ?: d  …8 ?' G" z. p, M( e9 R. @
  byte[] data=null;
7 J0 T# u+ \4 s) ^) v9 l  Connection conn=null;" I8 @: ^$ ^3 W5 j
  Try
/ ^% e! R0 |8 |6 k+ O  E  {
" ~3 P7 L! e+ u3 M# r  G  data=http://www.qnr.cn/pc/ora/jsfd/201007/…  //图片信息  q+ t! j' e7 ]  d6 y& ~  j, E
  conn=..
+ ?7 A0 ]0 j! U+ o- O  ByteArrayInputStream in=new ByteArrayInputStream(data);
1 |; [6 s# `, \( u  updateBlob(in, conn, “Student”,”Picture”,”Name”,”zhangsan”);
7 p7 V% [  c& D( P  …
  J  Q8 l& m2 P, S! w3 p& z  …; N5 \# S2 _7 j0 I  m
  public static void updateBlob(  InputStream instream,
( L. y/ G3 |. I# p  Connection conn,. [5 u* f, a2 j5 c. Y+ ~
  String table,8 I6 ~7 b# V5 l% }
  String blobColumn,6 s1 S4 y# c: G6 v1 @- R
  String keyColumn,
* `: R5 w! N: g& w3 w  String keyValue)4 T( w5 Q$ i8 ]5 F; D# _
  throws SQLException, IOException
6 C8 Z7 D: S$ d) |0 m6 k& `9 I  {3 X, ]* h+ o, }* [2 t5 R; e" L+ Z
  Statement stmt = null;
; U" B- D* A8 O9 N' i  X. o. ~. P  OracleResultSet rs = null;: q0 x: j8 E/ ~% ^( S4 [
  BLOB blob = null;
% w, T; c7 U. A+ t  boolean oldAutoCommit = conn.getAutoCommit();
2 Z6 ^9 a5 _1 N8 k" [/ t  StringBuffer sqlBuffer = new StringBuffer();
% `4 q0 O8 y  X- q4 H  try {
& R5 u/ w, u) `+ B$ x) h  conn.setAutoCommit(false);' m* l7 X& q+ P$ I- O% W7 D7 D
  sqlBuffer.append("select ");3 J% g- I7 A9 M' X* U' w
  sqlBuffer.append(blobColumn);
2 M/ a, A. W  n2 s2 d  sqlBuffer.append(" from ");
6 m4 w7 L( q. Q& w- R  sqlBuffer.append(table);1 f0 V' r- ?+ B) h! ]0 N
  sqlBuffer.append(" where ");
: g4 Q2 d2 Q* H0 q/ f: Y& y4 p: a  sqlBuffer.append(keyColumn);
( M8 \! ^5 }: ?7 `2 O  sqlBuffer.append("='");
' j' V$ M5 E( n6 O  sqlBuffer.append(keyValue);
回复

使用道具 举报

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

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

</p>  //注重这里的”for update”1 b. v& N- f1 W0 V
  sqlBuffer.append("' for update ");
7 @- K3 t6 @! A1 L% S: U  c% e  stmt = conn.createStatement();0 T  y9 G2 h  S' M; Z- V
  rs = (OracleResultSet) stmt.executeQuery(sqlBuffer.toString());
% ^. A  h; o; ]  if (!rs.next()), F% u6 p7 c8 N
  {" v. V) o# z' ~0 ?
  rs.close();( v, G1 p$ V  V3 E$ t* l! ~$ n7 q8 {
  stmt.close();
& W( y" t4 H& j$ u, L" M& _8 `1 r/ A  throw new IllegalArgumentException(
' F  E* B! I0 U- f. s% ~& F6 N2 n  "no record found for keyValue: '" + keyValue + "'");- M& E% b# `/ O. e( S. A2 C
  }
0 N: L* t, d: d+ `& F  blob = rs.getBLOB(1);1 t3 s/ I, {3 n' A
  OutputStream outstream = blob.getBinaryOutputStream();- k; B2 {# \9 g6 g7 |1 D  f! X
  int bufferSize = blob.getChunkSize();
* o* ~0 ]  G6 |7 r9 `2 t# K  byte[] buffer = new byte[bufferSize];0 T5 I9 z7 |, Z
  int bytesRead = -1;
( T9 {! j5 S# y  while ((bytesRead = instream.read(buffer)) != -1)
8 A8 y8 Y3 n+ @+ X  {
* t, G: k1 ?; m8 H6 C: q2 V8 u: o  outstream.write(buffer, 0, bytesRead);9 r6 V$ r. C8 j8 J# \$ Y5 F
  }
8 @9 u. y9 U% ]2 w  instream.close();/ P8 b- C' f. D; @4 h: M$ U- ]0 g
  outstream.close();0 t6 p" N3 S6 U0 _' d9 j% s! M7 e* P
  rs.close();6 D- q; j# n8 H
  stmt.close();5 W; i1 Z' f' R) @
  }
* @$ q$ L0 E5 ^. c  catch (SQLException e)& ]5 t/ i5 c* ^( f* X
  {
1 k' G* W% P6 Z! S  g! j; s$ N  throw e;
- \8 h5 i" Q( c  }- s$ k$ Z3 p2 d, s- S$ O6 k; c
  catch (IOException e)( q- k. `7 H+ m$ R4 }7 l+ U
  {; e) k3 c7 x( ]4 x1 D, U5 I
  throw e;
' ?! }" x$ j: P  }" J% y) }0 \# G; L: z( Q$ X9 i; a
  finally {4 B, r. {) L& ?. J8 N/ H
  conn.setAutoCommit(oldAutoCommit);/ D6 a! J, r: I/ p' K4 W$ M% z% M
  }, A& Y% ?6 ~* t$ M* W" T
  }
' q7 K" H6 c3 Z9 O, P1 q  二、PL/SQL下
7 p  z4 ^9 u& r8 c% ^  (例子表结构如一所示)6 w! I6 x6 N) _7 x% d
  i.插入一空的Blob。
) F( U0 Q. s& D  …
% |4 \# \5 h6 d) m- [8 {  declare9 k5 X' G. e1 D1 p  `# Z  k8 |
  bufferBlob BLOB;
; s* F# H4 M$ w  m% a0 E  data        RAW(…)
7 ^7 }4 B" u, V, m7 b' n  …
. P! R7 N8 b0 l5 c" I( f$ k, J5 ?  INSERT  INTO Student VALUES(‘zhangsan’, 20 , empty_blob() );' j$ z% N+ h, f
  …+ F; {- R2 @; j" y" I
  ii.更新该记载的Blob。
- ~* f2 G. g0 c% u) `( f  …/ H% W. b, V/ v' N
  SELECT Picture INTO bufferBlob FROM Student WHERE Name=’zhangsan’ FOR UPDATE;$ A# Z3 |- H9 ?6 [3 w
  DBMS_LOB.OPEN(bufferBlob , dbms_lob.lob_readwrite);
1 b  k- ^( Q9 e  E5 e  dbms_lob.write(bufferBlob , utl_raw.length(data) , data);
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 18:36 , Processed in 0.176876 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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