将N模式中所有表中的db2中的数据导出到具有列名称的CSV中

时间:2019-06-20 18:08:32

标签: sql bash shell csv db2

我正在尝试使用列名将一堆DB2表导出到CSV。我看不出有任何直接的方法可以做到这一点。我遵循this来获取所需的数据。但是我必须在数百个表上执行。有没有一种方法可以动态获取给定N个模式名称的所有列和表?

我还尝试了this,该模式将所有表以模式导出到csv,但这并没有给我列名。因此,如果有人可以向我展示如何更改此脚本以在CSV中获取列名称,那么我的工作就完成了。

服务器正在运行:Red Hat Linux服务器。

2 个答案:

答案 0 :(得分:0)

尝试使用这个出色的工具:https://www.sql-workbench.eu/。它是通用的,您可以在任何类型的数据库马达之间传输数据。

答案 1 :(得分:0)

使用文件

以下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个命令组成:
* db2 export命令可获取以逗号分隔的列列表
* db2 export命令来获取表数据
*串联命令,将以上两个输出收集到一个文件中

您可以按以下方式运行此脚本:

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