将 BLOB 文件提取为 DB2 中的多个文件

问题描述 投票:0回答:3

我想提取在

BLOB
数据库中存储为
DB2
的原始文件。 我使用了这个
DB2
命令:

EXPORT TO MyFile.DEL OF DEL LOBS TO . LOBFILE lob SELECT BLOB_COL 
FROM MY_TABLE where REPORT_ID in
(select report_id from My_TABLE2 where CONDITION)

我得到一个

.blob
文件,其中包含所有文件的内容。 现在我想知道是否有一种方法可以将每个文件导出到单个文件中,而不是将它们聚集在同一个文件中。

这在 DB2 中可能吗?

sql db2 blob
3个回答
4
投票

在最新版本的 DB2 for LUW(至少从 v9.5 开始)中,可以通过指定

lobsinsepfiles
修饰符来实现:

EXPORT TO MyFile.DEL OF DEL LOBS TO . LOBFILE lob 
MODIFIED BY lobsinsepfiles
SELECT ...

1
投票

是的,您可以通过将关键字

lobsinsepfiles
添加到
EXPORT
语句中来将 LOB 存储在不同的文件中。 详情请看这里。还有一些选项可以指定如何构造单个文件名,我建议使用这些选项。

您的陈述如下:

 EXPORT TO MyFile.DEL OF DEL LOBS TO . LOBFILE lob
 MODIFIED BY lobsinsepfile
 SELECT BLOB_COL FROM MY_TABLE where REPORT_ID in
 (select report_id from My_TABLE2 where CONDITION)

0
投票
  1. 查明谁是管理您的 DB2 所在服务器的团队 居住,
  2. 获得对服务器的安全 shell (ssh) 访问权限,
  3. 准备好你的工具:我使用 Fedora Linux,但你也可以使用 Windows 和 Mac,只需搜索或与服务器管理员交谈(这就是为什么第一步是找出他们是谁),
  4. 要求服务器管理员提供使用服务器操作系统通过 ssh 连接到 DB2 的过程。以下是他们告诉我的方法:
ssh server.com
<login>
. /home/dbadminuser/sqllib/db2profile
db2  connect to DATABASE
cd /db/dbadminuser/db2backup/export

以 1 年为单位批量导出所有附件

db2 "export to ATTACHMENTS2023.del of del lobs to . modified by lobsinfile lobsinsepfiles select RECNO, SEQNO, FILENAME, ATTACHMENT from PCT.ATTACHMENT where ROW_UPDATE_DT BETWEEN '2023-01-01' AND '2024-01-01'"

压缩

tar cf - *2023* | gzip -9 > lob2023.tar.gz

清理

rm ATT*

使用安全复制 (scp) 下载文件

scp server.com:/db/dbadminuser/db2backup/export/*2023* ~/Downloads/db_backup/

所有下载完成后清理服务器上的其余部分:

rm *.tar.gz

提取档案。这是如何在 Linux 中完成的。

tar xzf lob2023.tar.gz

注意重命名“del”文件

mv ATTACHMENTS2023.del ATTACHMENT2023.csv

在其顶行添加列名称。

有很多更有效的方法可以做到这一点,我只是使用“vi”文本编辑器。

vi ATTACHMENT2023.csv

i for insert
new first line:
"RECNO","SEQNO","FILENAME","ATTACHMENT"
Esc for quit the insert mode
:wq for write and quit vi

在这里,我应该检查 ATTACHMENT.csv 中文件名的编码是否有“£”、“€”、“μ”、“û”、“ó”和其他特殊字符的错误显示。我后来修复了这些。

下载完成后,您将拥有一个包含 1 个 csv 文件和许多 lob1.001 至 lobn.nnn 的文件夹,其中“n”是您想要重命名的数字。在此表中,文件名位于“文件名”列中。

对于我的特殊需求,希望在单独的文件夹中拥有每个记录及其所有文件的文件夹结构,以记录编号_序列编号_文件名命名(因为2个文件可以具有相同的名称,但顺序不同): RECNO/RECNO_SEQNO_FILENAME

我使用 PowerShell(最新版本)自动执行此操作(是的,是的,还有其他更好的编程语言,我有时间为这项任务学习这一语言):

  1. 它读取 CSV 文件,了解第一行包含列名称,
  2. 然后使用列名称作为保存每行值的变量,
  3. 使用这些变量,它为每个变量创建文件夹 记录
  4. 并将文件“移动”到新名称。

可能有更优化的方法来做到这一点,我只是使用了这个。

PS > Import-Csv .\ATTACHMENT2023.csv -Delimiter "," | ForEach-Object -Process {New-Item -Path "." -Name ($_.RECNO) -ItemType "directory"; Move-Item ($_.ATTACHMENT) -Destination (".\" + $_.RECNO + "\" + $_.RECNO + "_" + $_.SEQNO + "_" + $_.FILENAME)}
© www.soinside.com 2019 - 2024. All rights reserved.