【问题标题】:Execute many db2 commands in one command在一个命令中执行多个 db2 命令
【发布时间】:2019-10-01 13:56:15
【问题描述】:

我可以在一个命令中运行多个 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

【问题讨论】:

  • 用“;”分隔它们并使其成为单个字符串
  • 我尝试过这样的事情:db2 connect to sample user db2admin using pwd; EXPORT TO result.csv OF DEL MODIFIED BY NOCHARDEL SELECT * FROM alarms; 返回一个错误:SQL0104N 在“”之后发现了一个意外的标记“EXPORT”。预期的标记可能包括:“新”。 SQLSTATE=42601
  • "db2" 不是命令
  • 好的,让我用另一个例子来解释一下,例如 VERTICA,我们有:vsql -h localhost -U user -w pwd -c "SELECT * FROM alarms" -A -o "alarms.csv" -F "|" -P footer=off -q
  • 你试过db2 "connect to ... ; export ..."吗?

标签: db2 db2-luw


【解决方案1】:

您似乎在使用 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 通过语法 @ 执行文本文件会更明智987654329@。这样做可以让您在文本文件中添加条件逻辑、处理异常、避免 shell 转义要求等。如果您将所有逻辑封装在一个脚本中,它会更容易测试,也更容易从单个 @987654330 运行@命令行。

如果您想创建一个不需要调用 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 数据库,还可以使用适用于 unix 的 Windows 子系统在某些配置中运行 Unix 样式的 shell 脚本。

【讨论】:

  • 谢谢@mao,所以最终起作用的是:来自 DB2 CLP:db2 connect to SAMPLE user db2admin using pwd && db2 -r "C:/Users/User/Desktop/alarms.csv" "SELECT * FROM alarms" 但如果我尝试从 Windows CMD 执行此操作,请说:db2cmd db2 connect to sample user db2admin using qscgywdvhu363 && db2 -r "C:/Users/EliasGhali/Desktop/alarms.csv" "SELECT * FROM alarms" 这不起作用
  • 查看更新的答案。除非每个命令在每个命令之间都有自己的db2' prefix and unless you use the &&` 或&,否则不能连接 CLP 命令。这就是为什么最好使用脚本文件。
  • 最终我使用的是来自powershell的:set-item -path env:Db2CLP -value "**$$**" ; db2 connect to SAMPLE user db2admin using pwd ; db2 -r "C:\Users\user\Desktop\alarms_20180327085700.csv" "SELECT * FROM alarms"
  • 但基本上你的回答让我找到了这个解决方案,所以我会把它设置为正确的答案谢谢
【解决方案2】:

您的示例在 Db2-land 中最直接的比较是 clpplus,它允许您指定数据库,但您还必须提供登录信息(包括密码或系统会提示您输入)。

db2cmddb2 框架中,您有几个选项,但很可能需要使用脚本文件。

一个选项:将注册表变量DB2DBDFT 设置为您的默认数据库。就个人而言,我不喜欢这个选项,因为它会导致您可能不希望与数据库建立隐式连接。

一个选项:将您的一系列命令放入一个文件并运行该文件。这是运行多个命令的更传统方式。命令可以用分号和换行符结束(这里理解 DOS 和 Unix 的区别)。您可以使用 -td @(例如)来使用不同的终止符。然后你会调用db2 -tf file.sql

一个选项:批处理文件。它与上面类似,但您将使用 db2cmd 环境来执行其中包含 db2 命令的批处理。 db2cmd 为您提供使用 Db2 的合适环境。如果您在此环境中连接到数据库,您将保持连接,直到您发出 CONNECT RESETTERMINATE、被强制断开连接或您的环境退出。因此,您的批处理文件只需:

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

(注意引号以防止命令行替换 * 所在的当前工作目录中的所有文件名)

【讨论】:

    【解决方案3】:

    两个选项。

    1-st:

    db2cmd /i /w /c "db2 ^"connect to sample^" & db2 ^"values 1^" & db2 connect reset"
    

    第二次:
    您可以将以下 Windows 系统环境变量 DB2CLP 设置为值 **$$**,然后直接从 Windows cmd 运行 db2 命令,如下所示:

    db2 "connect to sample" & db2 "values 1" & db2 connect reset
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2017-12-31
      • 2017-05-01
      • 1970-01-01
      相关资源
      最近更新 更多