如何把含有BLOB字段的表导出成二进制文本文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把含有BLOB字段的表导出成二进制文本文件相关的知识,希望对你有一定的参考价值。

参考技术A 更新数据的时候,写insert语句的时候,不更新blob字段,blob字段对应的数据用 empty_blob() 代替就行。

(注意:在执行上面那个 sql 之前,一定要把 connection 设置成不自动提交: conn.setAutoCommit(false); )

最后单独出来blob字段:
//把 blob 字段取出来
String sql = "select ANNEX from market_info_collect_t where info_id='"
+ infoId + "' for update ";
Statement stt=null;
stt = conn.createStatement();
rs = stt.executeQuery(sql);
if (rs.next())
blob = (oracle.sql.BLOB) rs.getBlob("ANNEX");
outStream = blob.getBinaryOutputStream();
instream = myFile.getContentStream();
byte[] data = new byte[instream.available()];
instream.read(data);
outStream.write(data, 0, data.length);

instream.close();
outStream.flush();
outStream.close();

上面这段是我以前写过的代码中的一部分,你看一下,希望对你能有帮助。。。本回答被提问者和网友采纳

BLOB 如何存储在索引视图中?

【中文标题】BLOB 如何存储在索引视图中?【英文标题】:How is BLOB stored in an indexed view? 【发布时间】:2017-04-02 07:47:35 【问题描述】:

问题

假设我在包含 varbinary(max) 列的表上创建索引视图,二进制内容是否会物理复制到索引视图的 B 树中,或者原始字段是否会以某种方式“引用”,而不会物理复制它们内容?

换句话说,如果我在包含 BLOB 的表上创建索引视图,是否会复制 BLOB 所需的存储空间?

更多详情

当对二进制数据使用全文索引时,例如varbinary(max),我们需要一个额外的“过滤器类型”列来指定如何从二进制数据中提取文本以便对其进行索引,如下所示:

CREATE FULLTEXT INDEX ON <table or indexed view> (
    <data column> TYPE COLUMN <type column>
)
...

在我的特殊情况下,这些字段位于不同的表中,我正在尝试使用索引视图将它们连接在一起,以便它们可以在全文索引中使用。

当然,我可以将类型字段复制到 BLOB 表中并手动维护它(使其与原始表保持同步),但我想知道我是否可以让 DBMS 自动为我做这件事,这样会更好 除非在存储方面要付出高昂的代价。

此外,将这两个表合并为一个本身会产生负面影响,此处不再赘述...

【问题讨论】:

很可能是副本,因为 blob 可能是计算值。 【参考方案1】:

这会复制 BLOB 所需的存储空间吗?

是的。索引视图将有自己的副本。

你可以从

中看到
CREATE TABLE dbo.T1
  (
     ID   INT IDENTITY PRIMARY KEY,
     Blob VARBINARY(MAX)
  );

DECLARE @vb VARBINARY(MAX) = CAST(REPLICATE(CAST('ABC' AS VARCHAR(MAX)), 1000000) AS VARBINARY(MAX));

INSERT INTO dbo.T1
VALUES      (@vb),
            (@vb),
            (@vb);

GO

CREATE VIEW dbo.V1
WITH SCHEMABINDING
AS
  SELECT ID,
         Blob
  FROM   dbo.T1

GO

CREATE UNIQUE CLUSTERED INDEX IX
  ON dbo.V1(ID)

SELECT o.NAME       AS object_name,
       p.index_id,
       au.type_desc AS allocation_type,
       au.data_pages,
       partition_number,
       au.total_pages,
       au.used_pages
FROM   sys.allocation_units AS au
       JOIN sys.partitions AS p
         ON au.container_id = p.partition_id
       JOIN sys.objects AS o
         ON p.object_id = o.object_id
WHERE  o.object_id IN ( OBJECT_ID('dbo.V1'), OBJECT_ID('dbo.T1') ) 

返回

+-------------+----------+-----------------+------------+------------------+-------------+------------+
| object_name | index_id | allocation_type | data_pages | partition_number | total_pages | used_pages |
+-------------+----------+-----------------+------------+------------------+-------------+------------+
| T1          |        1 | IN_ROW_DATA     |          1 |                1 |           2 |          2 |
| T1          |        1 | LOB_DATA        |          0 |                1 |        1129 |       1124 |
| V1          |        1 | IN_ROW_DATA     |          1 |                1 |           2 |          2 |
| V1          |        1 | LOB_DATA        |          0 |                1 |        1129 |       1124 |
+-------------+----------+-----------------+------------+------------------+-------------+------------+

【讨论】:

以上是关于如何把含有BLOB字段的表导出成二进制文本文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle中的blob字段下读取jpg格式文件保存

如何在oracle中的blob字段下读取jpg格式文件保存

怎样把文件转换成二进制形式的文本文件?

ORACLE数据库BLOB如何转化类型

如何导出含有CLOB字段的表数据

oracle如何导出具有clob字段类型的sql?