在一个命令中执行许多 db2 命令
Execute many db2 commands in one command
我可以 运行 在一个命令中使用多个 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 An unexpected token "EXPORT" was found following
"". Expected tokens may include: "NEW". SQLSTATE=42601
举个例子,对于VERTICA,vsql工具,可以这样做:
vsql -h localhost -U user -w pwd -c "SELECT * FROM alarms" -A -o
"alarms.csv" -F "|" -P footer=off -q
您似乎在使用 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 的任何 " 之前显示 ^)。
但是 &&
将要求每个命令 returns 一个零退出代码,这可能不是您想要的,尽管它通常是最安全的选择。如果前一个命令失败,则后续命令将不会 运行.
如果你想容忍一些非零的退出代码,使用括号 ( ... )
来分组命令,然后根据你的要求使用括号外的 &&
或 &
.您可以在任何一本好书中阅读有关 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 unix 子系统到 运行 Unix 风格shell 某些配置中的脚本。
您的示例在 Db2 领域中最直接的比较是 clpplus,它允许您指定数据库,但您还必须提供登录信息(包括密码,否则系统会提示您输入密码)。
在 db2cmd
和 db2
框架中,您有几个选项,但很可能需要使用脚本文件。
一个选项:将注册表变量 DB2DBDFT 设置为您的默认数据库。就个人而言,我不喜欢这个选项,因为它会导致与您可能不希望的数据库的隐式连接。
一个选项:将您的一系列命令放入一个文件中,然后 运行 该文件。这是 运行 宁多个命令的更传统的方式。命令可以用分号和换行符终止(它理解 DOS 和 Unix 的区别)。您可以使用 -td @
(例如)来使用不同的终止符。然后你会调用 db2 -tf file.sql
.
一个选项:批处理文件。它与上面类似,但您将使用 db2cmd 环境来执行其中包含 db2 命令的批处理。 db2cmd
为您提供使用 Db2 的合适环境。如果您连接到此环境中的数据库,您将保持连接状态,直到您发出 CONNECT RESET
、TERMINATE
、被强制断开连接或您的环境退出。所以你的批处理文件只会有:
db2 connect to sample user db2admin using pwd
db2 "EXPORT TO result.csv OF DEL MODIFIED BY NOCHARDEL SELECT * FROM alarms"
(注意引号以防止命令行替换 * 所在的当前工作目录中的所有文件名)
两个选项。
1-st:
db2cmd /i /w /c "db2 ^"connect to sample^" & db2 ^"values 1^" & db2 connect reset"
2-nd:
您可以将以下 Windows 系统环境变量 DB2CLP
设置为值 **$$**
和 运行 来自 windows cmd
的 db2 命令,如下所示:
db2 "connect to sample" & db2 "values 1" & db2 connect reset
我可以 运行 在一个命令中使用多个 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 An unexpected token "EXPORT" was found following "". Expected tokens may include: "NEW". SQLSTATE=42601
举个例子,对于VERTICA,vsql工具,可以这样做:
vsql -h localhost -U user -w pwd -c "SELECT * FROM alarms" -A -o
"alarms.csv" -F "|" -P footer=off -q
您似乎在使用 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 的任何 " 之前显示 ^)。
但是 &&
将要求每个命令 returns 一个零退出代码,这可能不是您想要的,尽管它通常是最安全的选择。如果前一个命令失败,则后续命令将不会 运行.
如果你想容忍一些非零的退出代码,使用括号 ( ... )
来分组命令,然后根据你的要求使用括号外的 &&
或 &
.您可以在任何一本好书中阅读有关 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 unix 子系统到 运行 Unix 风格shell 某些配置中的脚本。
您的示例在 Db2 领域中最直接的比较是 clpplus,它允许您指定数据库,但您还必须提供登录信息(包括密码,否则系统会提示您输入密码)。
在 db2cmd
和 db2
框架中,您有几个选项,但很可能需要使用脚本文件。
一个选项:将注册表变量 DB2DBDFT 设置为您的默认数据库。就个人而言,我不喜欢这个选项,因为它会导致与您可能不希望的数据库的隐式连接。
一个选项:将您的一系列命令放入一个文件中,然后 运行 该文件。这是 运行 宁多个命令的更传统的方式。命令可以用分号和换行符终止(它理解 DOS 和 Unix 的区别)。您可以使用 -td @
(例如)来使用不同的终止符。然后你会调用 db2 -tf file.sql
.
一个选项:批处理文件。它与上面类似,但您将使用 db2cmd 环境来执行其中包含 db2 命令的批处理。 db2cmd
为您提供使用 Db2 的合适环境。如果您连接到此环境中的数据库,您将保持连接状态,直到您发出 CONNECT RESET
、TERMINATE
、被强制断开连接或您的环境退出。所以你的批处理文件只会有:
db2 connect to sample user db2admin using pwd
db2 "EXPORT TO result.csv OF DEL MODIFIED BY NOCHARDEL SELECT * FROM alarms"
(注意引号以防止命令行替换 * 所在的当前工作目录中的所有文件名)
两个选项。
1-st:
db2cmd /i /w /c "db2 ^"connect to sample^" & db2 ^"values 1^" & db2 connect reset"
2-nd:
您可以将以下 Windows 系统环境变量 DB2CLP
设置为值 **$$**
和 运行 来自 windows cmd
的 db2 命令,如下所示:
db2 "connect to sample" & db2 "values 1" & db2 connect reset