首页 > 解决方案 > 在一个命令中执行多个 db2 命令

问题描述

我可以在一个命令中运行多个 db2 命令吗?即:从cmd:

db2cmd /c db2 /c connect to sample user sample_user using sample_pwd /c 
"SELECT * FROM table;"

我还尝试了以下方法:

db2 connect to sample user db2admin using pwd; EXPORT TO result.csv OF DEL 
MODIFIED BY NOCHARDEL SELECT * FROM alarms;

但没有解决以下错误:

SQL0104N 在“”之后发现了意外的标记“EXPORT”。预期的标记可能包括:“新”。SQLSTATE=42601

例如,对于 VERTICA、vsql 工具,可以这样完成:

vsql -h localhost -U user -w pwd -c "SELECT * FROM alarms" -A -o 
"alarms.csv" -F "|" -P footer=off -q

标签: db2db2-luw

解决方案


您似乎正在使用 Microsoft Windows db2cmd.exe 。

您的问题与 Db2 本身无关,而是更多关于CMD(cmd.exe) 脚本语法,这是 Microsoft 为批处理文件提供的遗留脚本语言,它仍然适用于 Windows-10,并且也适用于db2cmd.exe.

在 db2cmd.exe shell 中,您可以在不同的 Db2 命令之间使用“&&”序列(并且每个这样的命令都必须具有db2前缀)。此外,每个这样的命令行都必须将任何作为特殊字符的字符转义到 shell 本身。默认情况下,转义字符是插入符号 (^)。

例如db2 connect to dbname && db2 ^"export to alarms.csv of del ... select ^* from alarms^" && db2 connect reset

(我在您可能想要传递给 Db2-CLP 的任何 " 之前显示 ^ )。

但这&&将要求每个命令都返回一个零退出代码,这可能不是您想要的,尽管它通常是最安全的选择。如果前一个命令失败,则后续命令将不会运行。

如果您想容忍一些非零退出代码,请使用括号( ... )对命令进行分组,然后根据您的要求在括号外使用&&或。&您可以在任何一本好书以及大量在线示例中阅读有关 CMD 脚本的信息。

但是,在 Windows 上为 Db2 编写脚本时,将所有命令(不带 Db2 前缀)附加到纯文本文件中,然后通过语法要求 Db2 clp 执行文本文件会更明智db2 -tvf texfile。这样做可以让您在文本文件中添加条件逻辑、处理异常、避免 shell 转义要求等。如果您将所有逻辑封装在脚本中,它会更容易测试,也更容易从单个db2cmd /c ....命令运行 -线。

如果您想创建一个不需要db2cmd调用前缀的批处理文件(*.bat 或 *.cmd),您可以将批处理文件更改为在批处理文件的开头有几行以重新执行自身通过db2cmd.exe. 如果您db2cmd.exe已经在PATH环境变量上,这会更好,但如果不是这种情况,那么您可以完全限定db2cmd.exe批处理文件中的绝对路径名。在批处理文件开头添加的行是:

@rem re-execute via db2cmd if running from cmd.exe
@echo off
if "%DB2CLP%"=="" db2cmd /c /i /w "%0" %* & goto :EOF
db2 connect to sample user db2admin using pwd
if errorlevel 1 @echo "Failed to connect to database " && @goto :EOF
db2 "EXPORT TO result.csv OF DEL MODIFIED BY NOCHARDEL SELECT * FROM alarms"
if errorlevel 3 @echo "Export from Db2 failed" && @goto :EOF

此外,在 Windows 上,您可以使用 Powershell 脚本来操作 Db2 数据库,还可以使用 Windows 子系统 for unix 在某些配置中运行 Unix 样式的 shell 脚本。


推荐阅读