您现在的位置是:首页 >

实例化对象的方法 Oracle中大对象(lob)处理方法和实例

火烧 2022-02-06 19:08:40 1050
Oracle中大对象(lo )处理方法和实例   在oracle中 有 个大对象(lo )类型可用 分别是 lo clo file clo     下面是对lo 数据类型的简单介绍      lo :
实例化对象的方法 Oracle中大对象(lob)处理方法和实例

Oracle中大对象(lob)处理方法和实例  

  在oracle中 有 个大对象(lobs)类型可用 分别是blob clob bfile nclob     下面是对lob数据类型的简单介绍     blob:二进制lob 为二进制数据 最长可达 GB 存贮在数据库中     clob:字符lob 字符数据 最长可以达到 GB 存贮在数据库中     bfile:二进制文件;存贮在数据库之外的只读型二进制数据 最大长度由操作系统限制     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对象(blob clob)时 可以进行读和写 但处理外部lob对象bfile时 只能进行读操作 写的操作可以用pl/sql处理 另外用sql也可以处理lob 但要注意sql仅可以处理整个lob 不能操作lob的数据片     在dbms_lob包中内建了read() append write() erase() copy() getlength() substr()等函数 可以很方便地操作lob对象 这里不做深入讨论 读者可以参看相关的书籍     对于pl/sql 下面介绍一种技巧 用动态的pl/sql语句处理clob对象来传替表名!    example     动态PL/SQL 对CLOB字段操作可传递表名table_name 表的唯一标志字段名field_id clob字段名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_lob write(lobloc amt pos c_clob);  mit;  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_lob read(lobloc amount offset buffer);  return buffer;  exception  when no_data_found then  return buffer;  end;    l 用法说明     用select getclob(table_name field_id field_name v_id v_pos) as partstr from dual;    可以从CLOB字段中取 个字符到partstr中     编一个循环可以把partstr组合成dbms_lob getlength(field_name)长度的目标字符串      二 对于在其他不同的开发环境 例如vc vb pb java等环境下对lob的处理 处理方法不尽相同 在这里将简要举几个例子来说明不在oracle开发环境下对lob的处理     (一) 在pb中的处理    exampler   string ls_path ls_filename ls_jhdh  long ll_num ll_count rtn  blob ole_blob  ll_num=dw_lb getrow()  if ll_num> then ls_jhdh=dw_lb object ct_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中处理大对象 一般可以用OO O(oracle objects for ole)来处理大对象 这里介绍一种不用 处理大对象blob的方法     下面这段程序可以将一个文件(文本文件 doc文件 图象文件等)保存到数据库中 并可以将其从数据库读出    需要两个mandbutton    cmd 名称 cmdsave caption 保存    cmd 名称 cmdread caption 读取    一个cmddialog控件    同时需要创建一张表t_demo(字段id 类型 number ;字段text 类型 blob;)    exmple   Option Explicit  Dim rn As ADODB Connection  Public Function CreateDataSource(DataSource As String UserID As String Password As String) As Boolean  On Error GoTo DbConErr:  Set rn = New ADODB Connection  With rn   ConnectionString = Provider=OraOledb Oracle ; & _   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 ADODB Recordset  rs ActiveConnection = rn  rs LockType = adLockOptimistic  rs CursorLocation = adUseClient  rs Source = select * from t_demo   rs Open  ComDlgDir DialogTitle = 保存文件   ComDlgDir Filter = * *   ComDlgDir ShowSave  Call BlobToFile(rs Fields( text ) ComDlgDir filename)  Set rs = Nothing  Exit Sub  Set rs = Nothing  End Sub    Private Sub cmdsave_Click()  Dim rs As New ADODB Recordset  rs ActiveConnection = rn  rs LockType = adLockOptimistic  rs CursorLocation = adUseClient  rs Source = select * from t_demo   rs Open  rs AddNew  ComDlgDir DialogTitle = 选取文件   ComDlgDir ShowOpen  rs Fields( id ) Value =   If ComDlgDir filename <> Then  Call FileToBlob(rs Fields( text ) ComDlgDir filename)  rs Update  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 ADODB Field filename As String Optional ChunkSize As Long = )  Dim fnum As Integer bytesleft As Long bytes As Long  Dim tmp() As Byte  If (fld Attributes And adFldLong) = Then  Err Raise field doesn t support the GetChunk method   End If  If Dir$(filename) = Then Err Raise File not found   fnum = FreeFile  Open filename For Binary As fnum  bytesleft = LOF(fnum)  Do While bytesleft  bytes = bytesle lishixinzhi/Article/program/Oracle/201311/17733  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码