`
zxming12345
  • 浏览: 4729 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle中blob,clob字段的操作问题

阅读更多

在oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob。

  下面是对lob数据类型的简单介绍。
   blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据库中。
   clob:字符lob,字符数据,最长可以达到4GB,存贮在数据库中。
   bfile:二进制文件;存贮在数据库之外的只读型二进制数据,最大长度由操作系统限制。
   nclob:支持对字节字符集合(nultibyte characterset)的一个clob列。
  对于如何检索和操作这些lob数据一直是oracle数据库开发者经常碰到的问题。下面我将在oracle对lob数据处理的一些方法和技巧,介绍给读者,希望能够对读者以后的开发有所帮助。
  oracle中可以用多种方法来检索或操作lob数据。通常的处理方法是通过dbms_lob包。
  其他的方法包括使用api(application programminginterfaces)应用程序接口和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 1.
  动态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 varchar2,

  field_id in varchar2,

  field_name in varchar2,v_id in number,

  v_pos in number,

  v_clob in varchar2)

  is

  lobloc clob;

  c_clob varchar2(32767);

  amt binary_integer;

  pos binary_integer;

  query_str varchar2(1000);

  begin

  pos:=v_pos*32766 1;

  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 32766 varchar2 into lobloc

  dbms_lob
.write(lobloc, amt, pos, c_clob);

  commit;

  exception

  when others then

  rollback;

  end;

 

  用法说明:
  在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),然后调用以上的过程插入大于2048到32766个字符。如果需要插入大于32767个字符,编一个循环即可解决问题。

  
     查询CLOB的PL/SQL函数:getclob

  create or replace function getclob(

  table_name in varchar2,

  field_id in varchar2,

  field_name in varchar2,

  v_id in number,

  v_pos in number) return varchar2

  is

  lobloc clob;

  buffer varchar2(32767);

  amount number := 2000;

  offset number := 1;

  query_str varchar2(1000);

  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-1)*2000;

  --read 2000 varchar2 from the buffer

  dbms_lob
.read(lobloc,amount,offset,buffer);

  return buffer;

  exception

  when no_data_found then

  return buffer;

  end;

   用法说明:
  用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;
  可以从CLOB字段中取2000个字符到partstr中,编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。

  二、对于在其他不同的开发环境,例如vc,vb,pb,java等环境下对lob的处理,处理方法不尽相同,在这里将简要举几个例子来说明不在oracle开发环境下对lob的处理。

  (一) 在pb中的处理

  exampler 2.

string ls_path,ls_filename,ls_jhdh

  long ll_num,ll_count,rtn

  blob ole_blob

  ll_num=dw_lb.getrow()

  if ll_num>0 then ls_jhdh=dw_lb.object.ct_njhdh[ll_num]

  select count(*) into :ll_count from sj_jh_jhfjb where

  ct_jhdlxbh='1' and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;

  if ll_count>0 then

  rtn=messagebox("提示","是否要修改此附件",question!,yesno!,1)

  if rtn=1 then

  SELECTBLOB ct_jhfjnr INTO le_blob from sj_jh_jhfjb where

  ct_jhdlxbh='1' and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;

  ole_1.objectdata =ole_blob

  If ole_1.activate(offsite!) <> 0 Then

  Messagebox("OLE Activate","不能激活")

  Return -1

  end If

  end if

  else

  messagebox("提示","没有附件")

  end if

  end if
 


  (二)在vb中的处理

  在vb中处理大对象,一般可以用OO4O(oracle objects for ole)来处理大对象。这里介绍一种不用0040处理大对象blob的方法。
  下面这段程序可以将一个文件(文本文件,doc文件,图象文件等)保存到数据库中,并可以将其从数据库读出需要两个commandbutton
  cmd1 名称 cmdsave caption 保存
  cmd2 名称 cmdread caption 读取
  一个cmddialog控件
  同时需要创建一张表t_demo(字段id 类型 number,;字段text 类型 blob;)
  exmple 3.

  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.1;"
 

 

 

分享到:
评论

相关推荐

    读取oracle数据库中clob字段的值

    ### 读取Oracle数据库中CLOB字段的值 在处理Oracle数据库时,经常会遇到需要读取CLOB(Character Large Object)类型字段的情况。CLOB主要用于存储大量的文本数据,如文章、文档等内容。由于CLOB类型的数据量可能...

    ORACLE中CLOB字段转String类型

    ### ORACLE中CLOB字段转String类型 在Oracle数据库中,`CLOB`(Character Large Object)是一种用于存储大量文本数据的数据类型。由于其能够存储非常大的文本块(最大可达4GB),因此常被用于存储文章、报告或任何...

    oracle(blob转换为clob)

    在Oracle数据库环境中,数据类型BLOB(Binary Large Object)用于存储大量的二进制数据,如图像、音频或视频文件,而CLOB(Character Large Object)则用于存储大量文本数据。在某些情况下,可能需要将BLOB类型的...

    sql server中的image类型的数据导出到oracle的clob字段中

    SQL Server 中 Image 类型数据导出到 Oracle 的 CLOB 字段中 在进行数据库迁移或数据交换时,需要将不同数据库管理系统之间的数据类型进行转换。在本文中,我们将讨论如何将 SQL Server 中的 Image 类型数据导出到 ...

    mysql和Oracle在对clob和blob字段的处理

    - 存储机制:MySQL的`TEXT`和`BINARY`系列数据类型通常存储在数据页中,而Oracle的`CLOB`和`BLOB`可以存储在表空间中,允许更大的数据量。 - 索引支持:Oracle支持对`CLOB`和`BLOB`字段建立索引,而MySQL的索引...

    jdbc读写Oracle的CLOB字段

    JDBC读写Oracle的CLOB字段

    Oracle导出Clob,Blob工具版本2

    "Oracle导出Clob,Blob工具版本2" 是一个专为解决这个问题而设计的应用程序,它改进了对CLOB(Character Large Object)和BLOB(Binary Large Object)数据类型的导出效率,特别是修复了上一版本中导出时间过长的问题...

    批量导出ORACLE数据库BLOB字段生成图片

    用户只需提供必要的连接信息和表字段名,就能自动批量导出BLOB字段中的图片。 总之,批量导出Oracle数据库中的BLOB字段生成图片涉及到了数据库连接、SQL查询、BLOB数据处理和文件I/O等多个技术环节。掌握这些知识点...

    Oracle导出Clob,Blob工具

    在描述中提到的“Oracle导出Clob,Blob等大字段工具”就是为了解决这个问题而设计的,它是一个自编写的实用程序,方便用户导出和管理Oracle数据库中的大对象数据。 Oracle数据库中的Clob类型用于存储大量的文本数据...

    Oracle如何对CLOB行字段来执行全文检索

    Oracle CLOB 行字段全文检索实现方法 Oracle 数据库中,CLOB 行字段是一种常用的数据类型,用于存储大...这些过程函数可以帮助开发者更好地操作 LOB 数据类型,实现对 CLOB 字段中的内容进行 Like 查找和其他操作。

    图片存入Oracle中,用clob和blob两种方式

    - **插入数据**:通过SQL插入语句,将转换后的图片数据插入到相应的字段中。 - **保存图片**:提交事务,确保数据保存到数据库中。 4. **从Oracle中读取图片**: - **查询数据**:使用SQL查询语句获取`CLOB`或`...

    oracle blob 字段 读写 delphi

    本篇文章将深入探讨如何在Delphi中对Oracle数据库的BLOB字段进行读写操作。 首先,你需要在Delphi项目中引入Oracle数据库访问的相关组件,如DBExpress或ADO。DBExpress是Delphi内置的一个轻量级数据库访问框架,而...

    oracle中的BLOB(照片)转换到mysql中

    总结来说,从Oracle的BLOB类型字段中提取并转换到MySQL的过程涉及到查询、导出、上传等多个步骤。在实际操作中,需要对数据库API有深入理解,并注意数据的兼容性和性能优化。通过以上方法,你可以顺利地在两个数据库...

    Mybatis 处理 CLOB、BLOB 类型数据

    在 Oracle 数据库中,BLOB 类型对应的数据库类型是 BLOB,在 MySQL 中对应的类型是 BLOB。 MyBatis 提供了对 CLOB 和 BLOB 类型的内置支持,通过将 CLOB 类型映射到 Java 的 String 类型,BLOB 类型映射到 byte[] ...

    关于oracle中clob字段查询慢的问题及解决方法

    这个问题在标题和描述中已经提及,即在对CLOB字段进行“like”操作时,查询速度会变得非常缓慢。 首先,尝试将CLOB字段直接转换为VARCHAR2类型进行查询,如以下语句所示: ```sql select * from table_name where ...

    文件上传至oracle blob字段的java实现

    指定文件夹下的所有文件上传至oracle的blob字段,java实现

    oracle中blob 字段类型的应用

    在PL/SQL中,可以编写动态SQL来操作Clob字段。例如,给出的`updateclob`过程是一个动态更新Clob字段的例子,它接受表名、唯一标识字段名、Clob字段名、记录号、处理字符的起始位置以及要插入的字符串变量。该过程...

    kettle通过java代码将数据库blob 字段抽取到本地文件

    kettle通过java代码将数据库blob 字段抽取到本地文件

    如何将DB2数据库中的大对象(BLOB,CLOB)数据类型复制到Oracle数据库中

    - **联邦能力**:利用WII的联邦功能,先将DB2中的非BLOB字段复制到Oracle目标表中。 - **标志字段**:在Oracle目标表上添加一个额外的“flag”字段,初始值设为“1”。此字段用于识别哪些记录需要更新BLOB数据。 ...

Global site tag (gtag.js) - Google Analytics