Подстановка команд в той же оболочке, db2 сообщает об отсутствии соединения - PullRequest
0 голосов
/ 30 октября 2009

У меня есть следующий фрагмент сценария bash:

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

$query содержит запрос select count, -x просто выводит результат команды без заголовков, поэтому var будет присвоен номер.

В результате получается, что $(...) выполняется в подоболочке и не наследует соединение с DB2, что приводит к сообщению "SQL1024N A database connection does not exist. SQLSTATE=08003".

Я не знаю, как команда db2 connect влияет на окружающую среду.

Ответы [ 3 ]

4 голосов
/ 03 ноября 2009

Один совет: задайте для переменной среды 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}"

Удачи!

2 голосов
/ 30 октября 2009

Если вы можете выполнить всю обработку переменных в подоболочке, вы можете сделать что-то вроде этого:

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

Однако вам придется использовать временные файлы или именованные каналы, чтобы получить значения переменных обратно в родительский.

0 голосов
/ 30 октября 2009

Не зная специфики здесь: первая команда 'db2 connect to $ DB', вероятно, завершает работу и устанавливает соединение. Как только он закончил, он также закрыл его.

Звучит так, будто вам нужна конструкция, подобная этой:

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

IOW: запустите команду db2 и дайте ему сначала выполнить «connect to $ DB» (оболочка заменит вам $ DB), а затем «$ query» (снова оболочка сделала замену.)

Я не уверен, какой разделитель хочет использовать db2, поэтому ';' было предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...