熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

關於oracle中大對象處理的一些方法和實例

2013-11-13 15:31:44  來源: Oracle 

  在oracle中個大對象(lobs)類型可用分別是blobclobbfilenclob
  下面是對lob數據類型的簡單介紹
  l blob:二進制lob為二進制數據最長可達GB存貯在數據庫中
  l clob:字符lob字符數據最長可以達到GB存貯在數據庫中
  l bfile:二進制文件;存貯在數據庫之外的只讀型二進制數據最大長度由操作系統限制
  l nclob支持對字節字符集合(nultibyte characterset)的一個clob列
  對於如何檢索和操作這些lob數據一直是oracle數據庫開發者經常碰到的問題下面我將在oracle對lob數據處理的一些方法和技巧介紹給讀者希望能夠對讀者以後的開發有所幫助
  oracle中可以用多種方法來檢索或操作lob數據通常的處理方法是通過dbms_lob包
  其他的方法包括使用api(application programming interfaces)應用程序接口和oci(oracle call interface)oracle調用接口程序
  一在oracle開發環境中我們可以用dbms_lob包來處理!dbms_lob包功能強大簡單應用既可以用來讀取內部的lob對象也可以用來處理bfile對象但處理兩者之間還有一點差別處理內部lob對象(blobclob)時可以進行讀和寫但處理外部lob對象bfile時只能進行讀操作寫的操作可以用pl/sql處理另外用sql也可以處理lob但要注意sql僅可以處理整個lob不能操作lob的數據片
  在dbms_lob包中內建了read()appendwrite()erase()copy()getlength()substr()等函數可以很方便地操作lob對象這裡不做深入討論讀者可以參看相關的書籍
  對於pl/sql下面介紹一種技巧用動態的pl/sql語句處理clob對象來傳替表名!
  example
  動態PL/SQL對CLOB字段操作可傳遞表名table_name表的唯一標志字段名field_idclob字段名field_name記錄號v_id開始處理字符的位置v_pos傳入的字符串變量v_clob
  修改CLOB的PL/SQL過程updateclob
  create or replace procedure updateclob(
  table_name in varchar
  field_id in varchar
  field_name in varchar
  v_id in number
  v_pos in number
  v_clob in varchar)
  is
  lobloc clob;
  c_clob varchar();
  amt binary_integer;
  pos binary_integer;
  query_str varchar();
  begin
  pos:=v_pos*+;
  amt := length(v_clob);
  c_clob:=v_clob;
  query_str :=select ||field_name|| from ||table_name|| where ||field_id||= :id for update ;
  initialize buffer with data to be inserted or updated
  EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
  from pos position write varchar into lobloc
  dbms_lobwrite(lobloc amt pos c_clob);
  commit;
  exception
  when others then
  rollback;
  end;
  l /用法說明
  在插入或修改以前先把其它字段插入或修改CLOB字段設置為空empty_clob()
  然後調用以上的過程插入大於個字符
  如果需要插入大於個字符編一個循環即可解決問題
  查詢CLOB的PL/SQL函數getclob
  create or replace function getclob(
  table_name in varchar
  field_id in varchar
  field_name in varchar
  v_id in number
  v_pos in number) return varchar
  is
  lobloc clob;
  buffer varchar();
  amount number := ;
  offset number := ;
  query_str varchar();
  begin
  query_str :=select ||field_name|| from ||table_name|| where ||field_id||= :id ;
  initialize buffer with data to be found
  EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
  offset:=offset+(v_pos)*;
  read varchar from the buffer
  dbms_lobread(loblocamountoffsetbuffer);
  return buffer;
  exception
  when no_data_found then
  return buffer;
  end;
  l 用法說明
  用select getclob(table_namefield_idfield_namev_idv_pos) as partstr from dual;
  可以從CLOB字段中取個字符到partstr中
  編一個循環可以把partstr組合成dbms_lobgetlength(field_name)長度的目標字符串
  二對於在其他不同的開發環境例如vcvbpbjava等環境下對lob的處理處理方法不盡相同在這裡將簡要舉幾個例子來說明不在oracle開發環境下對lob的處理
  
  (一) 在pb中的處理
  exampler
  string ls_pathls_filenamels_jhdh
  long ll_numll_countrtn
  blob ole_blob
  ll_num=dw_lbgetrow()
  if ll_num> then ls_jhdh=dw_lbobjectct_njhdh[ll_num]
  select count(*) into :ll_count from sj_jh_jhfjb where ct_jhdlxbh= and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;
  if ll_count> then
  rtn=messagebox(提示是否要修改此附件question!yesno!)
  if rtn= then
  SELECTBLOB ct_jhfjnr INTO le_blob from sj_jh_jhfjb where ct_jhdlxbh= and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;
  ole_objectdata =ole_blob
  If ole_activate(offsite!) <> Then
  Messagebox(OLE Activate不能激活)
  Return
  end If
  end if
  else
  messagebox(提示沒有附件)
  end if
  end if
  
  (二)在vb中的處理
  在vb中處理大對象一般可以用OOO(oracle objects for ole)來處理大對象這裡介紹一種不用處理大對象blob的方法
  下面這段程序可以將一個文件(文本文件doc文件圖象文件等)保存到數據庫中並可以將其從數據庫讀出
  需要兩個commandbutton
  cmd 名稱 cmdsave caption 保存
  cmd 名稱 cmdread caption 讀取
  一個cmddialog控件
  同時需要創建一張表t_demo(字段id 類型 number;字段text 類型 blob;)
  exmple
  Option Explicit
  Dim rn As ADODBConnection
  Public Function CreateDataSource(DataSource As String UserID As String Password As String) As Boolean
  On Error GoTo DbConErr:
  Set rn = New ADODBConnection
  With rn
  ConnectionString = Provider=OraOledbOracle; & _
  password= [$ Password & ] & _
  User ID = [$ UserID & ] & _
  Data Source= [$ DataSource & ] & _
  Locale Identifier=
  Open
  End With
  CreateDataSource = True
  Exit Function
  DbConErr:
  CreateDataSource = False
  End Function
  
  Private Sub cmdRead_Click()
  Dim rs As New ADODBRecordset
  rsActiveConnection = rn
  rsLockType = adLockOptimistic
  rsCursorLocation = adUseClient
  rsSource = select * from t_demo
  rsOpen
  ComDlgDirDialogTitle = 保存文件
  ComDlgDirFilter = **
  ComDlgDirShowSave
  Call BlobToFile(rsFields(text) ComDlgDirfilename)
  Set rs = Nothing
  Exit Sub
  Set rs = Nothing
  End Sub
  
  Private Sub cmdsave_Click()
  Dim rs As New ADODBRecordset
  rsActiveConnection = rn
  rsLockType = adLockOptimistic
  rsCursorLocation = adUseClient
  rsSource = select * from t_demo
  rsOpen
  rsAddNew
  ComDlgDirDialogTitle = 選取文件
  ComDlgDirShowOpen
  rsFields(id)Value =
  If ComDlgDirfilename <> Then
  Call FileToBlob(rsFields(text) ComDlgDirfilename)
  rsUpdate
  End If
  Set rs = Nothing
  Exit Sub
  Set rs = Nothing
  End Sub
  
  Private Sub Form_Load()
  If Not CreateDataSource(sid systemp manager) Then
  MsgBox Connection failure!
  End If
  End Sub
  
  fld As ADODBField filename As String Optional ChunkSize As Long = )
  Dim fnum As Integer bytesleft As Long bytes As Long
  Dim tmp() As Byte
  If (fldAttributes And adFldLong) = Then
  ErrRaise field doesnt support the GetChunk method
  End If
  If Dir$(filename) = Then ErrRaise File not found
  fnum = FreeFile
  Open filename For Binary As fnum
  bytesleft = LOF(fnum)
  Do While bytesleft
  bytes = bytesleft
  If bytes > ChunkSize Then bytes = ChunkSize
  ReDim tmp( To bytes) As Byte
  Get fnum tmp
  fldAppendChunk tmp
  bytesleft = b
From:http://tw.wingwit.com/Article/program/Oracle/201311/16861.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.