sql - 将 db2 中的数据从 N 模式中的所有表中导出到带有列名的 CSV
问题描述
我正在尝试使用列名将一堆 DB2 表导出到 CSV。我没有看到任何直接的方法来做到这一点。我按照这个来获取我想要的数据。但我必须在数百个表上执行。有没有办法动态获取给定 N 模式名称的所有列和表?
我也尝试过将所有表导出到模式中的 csv 但这并没有给我列名。因此,如果有人可以向我展示如何更改此脚本以获取 CSV 中的列名,我的工作就完成了。
服务器正在运行:Red Hat Linux 服务器。
解决方案
使用文件
以下 db2 命令生成导出脚本:
export to exp.sql of del modified by nochardel
select
x'0a'||'export to file_header of del modified by nochardel VALUES '''||columns||''''
||x'0a'||'export to file_data of del messages messages.msg select '||columns||' from '||tabname_full
||x'0a'||'! cat file_header file_data > '||tabname_full||'.csv'
from
(
select rtrim(c.tabschema)||'.'||c.tabname as tabname_full, listagg(c.colname, ', ') as columns
from syscat.tables t
join syscat.columns c on c.tabschema=t.tabschema and c.tabname=t.tabname
where t.tabschema='SYSIBM' and t.type='T'
group by c.tabschema, c.tabname
--fetch first 10 row only
)
;
最好将上面的命令放在某个文件中gen_exp.sql
并运行它以生成导出脚本:
db2 -tf gen_exp.sql
导出脚本exp.sql
由每个表的 3 个命令组成:
* db2export
命令,用于获取逗号分隔的列列表
* db2export
命令,用于获取表数据
* 连接命令,用于将上述两个输出收集到单个文件
您按如下方式运行此脚本:
db2 -vf exp.sql -z exp.sql.log
使用管道
gen_exp_sh.sql:
export to exp.sh of del modified by nochardel
select
x'0a'||'echo "'||columns||'" > '||filename
||x'0a'||'db2 "export to pipe_data of del messages messages.msg select '||columns||' from '||tabname_full||'" >/dev/null 2>&1 </dev/null &'
||x'0a'||'cat pipe_data >> '||filename
from
(
select
rtrim(c.tabschema)||'.'||c.tabname as tabname_full
, rtrim(c.tabschema)||'.'||c.tabname||'.csv' as filename
, listagg(c.colname, ', ') as columns
from syscat.tables t
join syscat.columns c on c.tabschema=t.tabschema and c.tabname=t.tabname
where t.tabschema='SYSIBM' and t.type='T'
group by c.tabschema, c.tabname
--fetch first 10 row only
)
;
运行如下:
db2 -tf gen_exp_sh.sql
导出 shell 脚本exp.sh
包含每个表的 3 个命令:
* echo 命令,用于将逗号分隔的列列表写入文件
* db2 export 命令,用于将表数据获取到管道(在后台启动)
*cat
从管道并将数据添加到具有列列表的同一文件中
用法:
您必须先创建管道,然后再创建dot space script
导出脚本(符号 - 这很重要):
mkfifo pipe_data
db2 connect to mydb ...
. ./exp.sh
rm -f pipe_data
推荐阅读
- java - Java:在mac m1 monterey os上安装android studio时汇集的ApplicationImpl
- python - 为什么误差这么大?
- python - Python 不可散列类型:QTreeWidgetItem
- asp.net - 如何在 .cshtml ASP.NET 中实现 ComboBox
- vim - Vim 首选项
- java - MongoRepository :如果在存储库中找不到至少一个值,如何在 findAllBy 中抛出异常
- r - 如何在 R 的数据框中使用 grep
- windows - 即使在 Vagrant 停止/重新加载命令之后,VirtualBox Headless Frontend 进程也不会停止
- sql-server - 如何允许多个用户共享访问具有链接表和 sql server 共享中的表的 Access 数据库
- dependency-injection - TYPO3 依赖注入与 mpdf/mpdf