Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过bash将结果从DB2导出到CSV,包括列名_Bash_Shell_Db2_Sh - Fatal编程技术网

通过bash将结果从DB2导出到CSV,包括列名

通过bash将结果从DB2导出到CSV,包括列名,bash,shell,db2,sh,Bash,Shell,Db2,Sh,这个问题从已经提出的问题分支出来 我想创建一个包含db2结果(包括列名)的csv文件 EXPORT TO ... SELECT 1 as id, 'COL1', 'COL2', 'COL3' FROM sysibm.sysdummy1 UNION ALL (SELECT 2 as id, COL1, COL2, COL3 FROM myTable) ORDER BY id 虽然这确实有效,但我只剩下一个不需要的列和1、2的行 有没有一种方法可以通过db2命令或fullbash替代方法来实现这一

这个问题从已经提出的问题分支出来

我想创建一个包含db2结果(包括列名)的csv文件

EXPORT TO ...
SELECT 1 as id, 'COL1', 'COL2', 'COL3' FROM sysibm.sysdummy1
UNION ALL
(SELECT 2 as id, COL1, COL2, COL3 FROM myTable)
ORDER BY id
虽然这确实有效,但我只剩下一个不需要的列和1、2的行

有没有一种方法可以通过db2命令或fullbash替代方法来实现这一点,而不需要冗余列,同时保持头部在顶部

e、 g

第1列第2列第3列
数据1数据2数据3
...         ...         ...

而不是:

1第1列第2列第3列
2数据1数据2数据3

2 ... ... ...

DB2forLinux/Unix/Windows缺少一个(早就应该)简单的选项(导出命令)来满足这一常见需求

但是使用bashshell可以运行两个单独的导出(一个用于列标题,另一个用于数据),并通过中间命名管道将结果连接到文件

使用中间命名管道意味着不需要数据的两个平面文件副本

这是丑陋和尴尬,但它的工作

示例片段(您可以初始化变量以适应您的环境):


DB2forLinux/Unix/Windows缺少一个(早就应该)简单的选项(导出命令)来满足这一常见需求

但是使用bashshell可以运行两个单独的导出(一个用于列标题,另一个用于数据),并通过中间命名管道将结果连接到文件

使用中间命名管道意味着不需要数据的两个平面文件副本

这是丑陋和尴尬,但它的工作

示例片段(您可以初始化变量以适应您的环境):


我看到的所有答案都使用了两个独立的导出语句。第一个生成列标题:

db2 "EXPORT TO /tmp/header.csv of del  
SELECT 
SUBSTR(REPLACE(REPLACE(XMLSERIALIZE(CONTENT XMLAGG(XMLELEMENT(NAME c,colname) 
ORDER BY colno) AS VARCHAR(1500)),'<C>',', '),'</C>',''),3) 
FROM syscat.columns WHERE tabschema=${SCHEMA} and tabname=${TABLE}"
然后


我看到的所有答案都使用了两个独立的导出语句。第一个生成列标题:

db2 "EXPORT TO /tmp/header.csv of del  
SELECT 
SUBSTR(REPLACE(REPLACE(XMLSERIALIZE(CONTENT XMLAGG(XMLELEMENT(NAME c,colname) 
ORDER BY colno) AS VARCHAR(1500)),'<C>',', '),'</C>',''),3) 
FROM syscat.columns WHERE tabschema=${SCHEMA} and tabname=${TABLE}"
然后


这将适用于您的简单案例

EXPORT TO ...
SELECT C1, C2, C3 FROM (
SELECT 1 as id, 'COL1' as C1, 'COL2' as C2, 'COL3' as C3 FROM sysibm.sysdummy1
UNION ALL
(SELECT 2 as id, COL1, COL2, COL3 FROM myTable)
)
ORDER BY id

从长远来看,
EXTERNAL TABLE
支持(已经在Db2仓库中)具有
INCLUDEHEADER
选项(我想)将在某个时候出现在Db2中。

这将适用于您的简单情况

EXPORT TO ...
SELECT C1, C2, C3 FROM (
SELECT 1 as id, 'COL1' as C1, 'COL2' as C2, 'COL3' as C3 FROM sysibm.sysdummy1
UNION ALL
(SELECT 2 as id, COL1, COL2, COL3 FROM myTable)
)
ORDER BY id

从长期来看,
externaltable
支持(已经在Db2仓库中),它有
INCLUDEHEADER
选项(我猜)将在某个时候出现在Db2中。

如果您只希望提取数据的头,并且希望这些头始终位于顶部,并且希望能够更改这些头的名称,使其看起来更加用户友好,并将其全部放在CSV文件中

您可以执行以下操作:

# Creates headers and new output file
HEADERS="ID,USERNAME,EMAIL,ACCOUNT DISABLED?"
echo "$HEADERS" > "$OUTPUT_FILE"

# Gets results from database 
db2 -x "select ID, USERNAME, DISABLED FROM ${SCHEMA}.USER WHERE lcase(EMAIL)=lcase('$USER_EMAIL')" | while read ID USERNAME DISABLED ;
do

  # Appends result to file
  echo "${ID},${USERNAME},${USER_EMAIL},${DISABLED}" >> "$OUTPUT_FILE"

done

无需临时文件或合并。

如果您只需要提取数据的标题,并且希望这些标题始终位于顶部,并且希望能够更改这些标题的名称,使其看起来更方便用户,并将其全部放入CSV文件中

您可以执行以下操作:

# Creates headers and new output file
HEADERS="ID,USERNAME,EMAIL,ACCOUNT DISABLED?"
echo "$HEADERS" > "$OUTPUT_FILE"

# Gets results from database 
db2 -x "select ID, USERNAME, DISABLED FROM ${SCHEMA}.USER WHERE lcase(EMAIL)=lcase('$USER_EMAIL')" | while read ID USERNAME DISABLED ;
do

  # Appends result to file
  echo "${ID},${USERNAME},${USER_EMAIL},${DISABLED}" >> "$OUTPUT_FILE"

done

无需临时文件或合并。

我编写了一个存储过程,通过descripe命令提取标题。这些名称可以从临时表中检索,并导出到文件中。唯一仍然不可能的事情是通过SQL连接文件,因此最后一步需要对文件进行cat转换并重定向到另一个文件

CALL DBA.GENERATE_HEADERS('SELECT * FORM SYSCAT.TABLES') @
EXPORT TO myfile_header OF DEL SELECT * FROM SESSION.header @
EXPORT TO myfile_body OF DEL SELECT * FORM SYSCAT.TABLES @
!cat myfile_header myfile_body > myfile @
存储过程的代码位于:
更多信息请访问:。

我编写了一个存储过程,通过descripe命令提取标题。这些名称可以从临时表中检索,并导出到文件中。唯一仍然不可能的事情是通过SQL连接文件,因此最后一步需要对文件进行cat转换并重定向到另一个文件

CALL DBA.GENERATE_HEADERS('SELECT * FORM SYSCAT.TABLES') @
EXPORT TO myfile_header OF DEL SELECT * FROM SESSION.header @
EXPORT TO myfile_body OF DEL SELECT * FORM SYSCAT.TABLES @
!cat myfile_header myfile_body > myfile @
存储过程的代码位于:
更多信息,请访问:。

能否发布您所获得的内容的简短摘录,以及您实际想要的内容?能否发布您所获得的内容的简短摘录,以及您实际想要的内容?我喜欢错误检查。但是,mkfifo导致脚本挂起。阳离子必须发生在两个出口之间,如您的例子中,还是无关紧要?对我来说很好。您使用的是什么操作系统?使用管道时,两端必须打开,因此“cat”在后台从管道读取,而导出在另一个进程中进行,并写入管道。在linux上运行它。如果我声明mkfifo${target_file_tmp},那么db2-v“EXPORT TO${target_file_tmp}del SELECT…”将挂起。如果我移除它,它将按预期工作。我知道很奇怪。除非有需要或推荐,否则我不买。shell脚本位于DB2Linux框中并从中运行,我使用putty连接并运行它。实例所有者帐户需要能够写入管道。验证“cat”操作是否在后台发生(请参阅cat命令行末尾的&at),以便管道的两端同时打开。我喜欢错误检查。但是,mkfifo导致脚本挂起。阳离子必须发生在两个出口之间,如您的例子中,还是无关紧要?对我来说很好。您使用的是什么操作系统?使用管道时,两端必须打开,因此“cat”在后台从管道读取,而导出在另一个进程中进行,并写入管道。在linux上运行它。如果我声明mkfifo${target_file_tmp},那么db2-v“EXPORT TO${target_file_tmp}del SELECT…”将挂起。如果我移除它,它将按预期工作。我知道很奇怪。除非有需要或推荐,否则我不买。shell脚本位于DB2Linux框中并从中运行,我使用putty连接并运行它。实例所有者帐户需要能够写入管道。验证“cat”操作是否在后台发生(请参阅的命令行末尾的(&A)