0

我正在尝试在 KornShell (ksh) 中运行以下命令:

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" | awk '{print $1"."$2}'`

我试图实现的是将特定表上的索引列表放入一个数组中,稍后我可以遍历该数组。

问题是,当我运行上述命令时,数组的内容以“SQL1024N”的错误消息开头(这告诉我数据库连接不存在)。

但是,如果我这样删除awk语句末尾的 :

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"`

它工作得很好(嗯,在某种程度上它正在返回数据。显然没有awk我没有捕获正确的数据)。

有谁知道为什么awk会有这种影响?

我很欣赏有不止一种方法可以获取这些数据,但它让我困惑为什么会发生这种情况。

提前致谢。

4

4 回答 4

1

我怀疑它本身就是 awk 。也许 db2 对连接到 tty 或控制台的标准输出特别感兴趣?或者至少不喜欢它连接到管道时。

于 2009-02-04T10:19:21.263 回答
1

在这种情况下,当 DB2 CLP 说它没有连接到数据库时,这是因为 shell 打开了一个子进程,该子进程需要自己的专用 db2bp 后端进程,它无法访问原始 shell 进程打开的连接。并不是什么东西断开了,而是一个新创建的 shell 进程(及其伴随的 db2bp 进程)正在创建,但没有被告知连接到数据库。解决此问题的一种方法是在您知道自己处于其中一种情况时显式连接(或重新连接)到数据库。

set -A INDEXES `db2 connect to watevrDB >/dev/null;db2 -x describe indexes for table ${TABSCHEMA}.${TABNAME} show detail | awk {'print $1"."$2'}`

I realize that this question is more about scripting and awk with DB2 than about the system catalog, or else I would have recommended some straightforward catalog queries to produce the same result.

于 2009-06-19T20:15:40.323 回答
0

这是一个不寻常的问题,正如 Pez 所说,这可能是一个 db2 怪癖。

例如,在 db2 命令字符串之前使用 time 或 timex 时,我看到了类似的问题,其中 db2 没有定义的数据库要连接到。

有一个环境变量 DB2DBDFT 为隐式连接设置默认数据库。很抱歉,我不确定此变量是否可供非 DBA 用户使用(假设您是应用程序开发人员)。如果通过以下方式设置此变量,则值得研究:

db2set DB2DBDFT=${your_db_name}

并重试您的查询。

如果您的环境可以连接到多个数据库,那么您可以在完成工作后取消设置 DB2DBDFT 变量。

于 2009-02-04T18:44:00.777 回答
0

尝试带有 -x 开关的 db2 命令:

db2 **-x** "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"……

我遇到过这样的情况,这解决了我无法通过管道输出到 awk 的问题。

于 2009-02-11T13:17:39.697 回答