日期:2014-05-16  浏览次数:20432 次

Oracle--BLOB、CLOB、LONG、LongRaw

通过临时表从DBLink中获取Blob对象

做系统集成时,通过Database Link共享数据是不错的选择。不过真正使用DBLink时却碰到一个不小的问题:从远程数据库上查询Blob字段时总返回ORA-22992错误,如下:
select blobcolumn from remoteTable@dl_remote;
ORA-22992: 无法使用从远程表选择的 LOB 定位器
查找了一下解决方法,有人提出了采用物化视图可以解决这个问题。物化视图唯一的缺陷在于同步机制的问题,如果同步时间设置过短,则占用大量的系统资源,给服务器带来极大的压力;如果设置时间过长,前台用户不可接受。
后来还是AskTom给出了极好的解决方案:使用全局临时表。

SQL> create global temporary table foo
   (
      X BLOB
    )
    on commit delete rows;
Table created
SQL> insert into foo select blobcolumn from remoteTable@dl_remote where rownum = 1;
1 row inserted
SQL>

插入本地临时表之后,在本地的操作就没有任何问题了。
至于为什么临时表可以直接插入,而永久表为什么不能插入,本人未做具体研究,Tom也没有说明。

?

?

BLOB、CLOB、LONG、LongRaw数据类型

LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列
  LONG RAW: 可变长二进制数据,最长2G
  CLOB: 用来存储单字节的字符数据
  NCLOB: 用来存储多字节的字符数据
  BLOB: 用于存储二进制数据
  BFILE: 存储在文件中的二进制数据,这个文件中的数据只能被只读访。但该文件不包含在数据库内。
  CLOB,NCLOB,BLOB都是内部的LOB(Large Object)类型,最长4G,没有 LONG只能有一列的限制
  我要保存图片、文本文件、Word文件各自最好用哪种数据类型?
  --BLOB最好,LONG RAW也不错,但Long是oracle将要废弃的类型,因此建议用LOB。
注意:cob类型的不能通过dblink来访问,所以如果保存图片还是用long raw比较要些

?

?