在同一个shell中命令替换,db2报告没有连接

时间:2009-10-30 18:12:59

标签: bash db2

我在bash脚本中有以下代码段:

db2 connect to $DB
var=$(db2 -x "$query" | tr -d " ")

$query包含select count个查询,-x只打印出没有标题的命令结果,因此var将被分配给一个数字。

如果$(...)在子shell中执行,并且不继承与DB2的连接,则会发生“SQL1024N A database connection does not exist. SQLSTATE=08003”消息。

我不知道db2 connect命令如何影响环境。

3 个答案:

答案 0 :(得分:4)

一个提示:将DB2DBDFT环境变量设置为您要使用的数据库的名称:它将使DB2 CLP能够建立隐式连接(如果您在数据库服务器上运行)。

$ export DB2DBDFT=sample
$ db2 "select count(*) from empphoto"  # <-- no "db2 connect to sample" needed.

这也有助于使子壳工作。

#!/bin/ksh

export DB2DBDFT=sample
count=$(db2 -x "select count(*) from empphoto" | awk '{print $1}')
print "Count is ${count}"
祝你好运!

答案 1 :(得分:2)

如果您可以在子shell中执行所有变量处理,则可以执行以下操作:

db2 connect to $DB
db2 -x "$query" | tr -d " " | {
    read var
    do-stuff with var
}

但是,您必须使用临时文件或命名管道将变量值返回给父级。

答案 2 :(得分:0)

这里不知道具体细节:第一个命令'db2 connect to $ DB'可能已完成,并建立了连接。一旦完成,它也会关闭它。

听起来你想要一个像这样的结构:

var=$(db2 -x "connect to $DB;$query" | tr -d " ")

IOW:运行db2命令并让他首先执行'connect to $ DB'(shell将为你替换$ DB)然后'$ query'(shell再次进行替换。)

我不确定db2需要哪个分隔符,所以';'是一个猜测。