知识大全 关于oracle中大对象处理的一些方法和实例

Posted

篇首语:读书不要贪多,而是要多加思索,这样的读书使我获益不少。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于oracle中大对象处理的一些方法和实例相关的知识,希望对你有一定的参考价值。

  在oracle中 有 个大对象(lobs)类型可用 分别是blob clob bfile nclob   下面是对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对象(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 = bytesleft   If bytes > ChunkSize Then bytes = ChunkSize   ReDim tmp( To bytes) As Byte   Get fnum tmp   fld AppendChunk tmp   bytesleft = b cha138/Article/program/Oracle/201311/16861

相关参考

知识大全 关于js遍历表格的实例

js可以利用dom非常轻松的就可以遍历一个表格当然只要是dom中有的所有对象都可以通过js来访问和处理 复制代码代码如下:cha138/Article/program/Java/J

知识大全 Oracle中几个关于日期方面的SQL实例

Oracle中几个关于日期方面的SQL实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  №:取

知识大全 oracle 使用杂记二

  下面的是关于sql*loader的使用的一点总结有些是来自itpub上的一些网友的总结    大部分是oracle专家高级编程上的实例只是我实践以后写的结果    sqlldruserid=lgo

知识大全 关于触发器修改自身数据表实例

  前言  当然在触发器修改自身数据表对于有ORACLE数据库后台编程人员来说并不应该算是一个难题可能在平时的工作中就经常要遇到  但对于刚刚使用ORACLE数据库后台编程人员来说的确是一个比较烦人的

知识大全 实例讲解Oracle9i数据坏块的处理

实例讲解Oracle9i数据坏块的处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  笔者在一台

知识大全 jdbc方式读取oracle的clob字段实例

         可能大家也都习惯了spring和hibernate对CLOB字段的处理在spring中配置c

知识大全 浅谈Oracle中大数据量表的管理

浅谈Oracle中大数据量表的管理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介  随着信

知识大全 关于c#静态方法和实例方法的辨析和应用

  本文将围绕c#静态方法和实例方法讨论一下针对一些观点如静态方法是常驻内存还有静态方法比实例方法先装载做一个辨析同时讨论下何时用静态方法何时用实例方法  前几日在微软的好友发给我一个链接《静态方法和

知识大全 Oracle11gR1中大小写敏感的密码

Oracle11gR1中大小写敏感的密码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  密码大小

知识大全 Oracle实例和Oracle数据库详解

Oracle实例和Oracle数据库详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一ORA