gpt4 book ai didi

sql - 在 shell 脚本中运行选择时 DB2 服务器连接丢失

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:45 25 4
gpt4 key购买 nike

我试图在大量数据导入后自动执行一些约束检查,但遇到了流动问题。我找到了一个解决方法,我也会描述它,但是如果有人比我更了解 Linux 并且可以解释为什么会发生这种情况,我将非常感激。

因此,如果我在以实例所有者身份登录后从 DB2 CLI 运行以下命令,我将打印输出值,没有任何错误。

bla:~> VAL=$(db2 -x 'select count(*) from SIM.SUPPLIER')
bla:~> echo value = $VAL
value = 621684

如果我将命令保存在 select.sh 文件中并使用 在同一进程中调用脚本。 select.sh 以实例所有者身份登录后,我收到一条错误消息,指出没有连接到数据库。我认为命令替换以某种方式在未转发与服务器的连接的新线程中运行。

select.sh内容:

VAL=$(db2 -x 'select count(*) from SCHEMA.TABLE')

echo value = $VAL

我如何运行脚本:

bla:~> db2 connect to DB

Database Connection Information

Database server = DB2/LINUXX8664 11.1.0
SQL authorization ID = DB2INS10
Local database alias = DB

bla:~> . select.sh
value = SQL1024N A database connection does not exist. SQLSTATE=08003
bla:~>

如果 select.sh 只包含 db2 命令,没有分配给 VAL,则连接不会丢失:

select.sh内容:

db2 -x 'select count(*) from SIM.SUPPLIER'

bla:~> . select.sh
621684
bla:~>

现在解决方法:在一个文件中编写 SQL 选择并调用在 select.sh 中运行该文件可以达到目的并且连接不会丢失。

选择.sh内容

echo 'select count(*) from SIM.SUPPLIER;' > sql

db2 -txf sql

bla:~> . select.sh
621684
bla:~>

但这行不通,我不明白为什么:

echo 'select count(*) from SIM.SUPPLIER;' > sql

echo $(db2 -txf sql)

bla:~/> . select.sh
SQL1024N A database connection does not exist. SQLSTATE=08003
bla:~/>

那么有人可以向我解释为什么命令替换会失去服务器连接,以及我如何在保持服务器连接的同时仍然使用它。

PS:我不允许在任何脚本中连接到服务器。出于安全原因,不应将凭据写入文件内。服务器连接必须在调用其他脚本之前建立,并且只能建立一次。

谢谢

最佳答案

原因是 VAL=$(....)echo $(db2 -txf sql) 都运行一个子 shell,并且在那个子shell没有数据库连接。您的解决方法不涉及子 shell,因此它有效。

对于 bash,如果您无法在脚本中使用 connect,那么您必须避免对 Db2 CLP 进行子脱 shell ,就像您使用解决方法一样。

您可以使用临时文件来避免子 shell,代价是更多的解析等。例如,不要使用 VAL=$(db2 ...) 使用 db2 ... > $tmpfile 后跟 VAL=$(cat $tmpfile) 或类似技术。

您不能这样“转发连接”。

如果您能够将 ksh93 与协进程一起使用,那么您就可以在进程之间进行通信,并确保所有 db2 CLP 操作都发生在一个任务中,然后将结果通过管道传递给另一个任务。但这样的复杂性很少是值得的,使用不同的非 shell 脚本语言可能更可取。

关于sql - 在 shell 脚本中运行选择时 DB2 服务器连接丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55138471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com