Awk отключает мой сеанс DB2 при конвейере - PullRequest
0 голосов
/ 04 февраля 2009

Я пытаюсь запустить следующую команду в 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 ]

1 голос
/ 20 июня 2009

В этом случае, когда DB2 CLP сообщает, что она не подключена к базе данных, это потому, что оболочка открыла подпроцесс, который требует своего собственного выделенного внутреннего процесса db2bp, который не может получить доступ к соединению, открытому исходной оболочкой процесс. Дело не в том, что что-то отключается, а в том, что создается недавно созданный процесс оболочки (и сопровождающий его процесс db2bp), но ему не говорят подключаться к базе данных. Одним из способов решения этой проблемы является явное подключение (или повторное подключение) к базе данных, когда вы знаете, что находитесь в одной из этих ситуаций.

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

Я понимаю, что этот вопрос больше относится к сценариям и awk с DB2, чем к системному каталогу, иначе я бы порекомендовал несколько простых запросов к каталогу, чтобы получить тот же результат.

1 голос
/ 04 февраля 2009

Я сомневаюсь, что это само по себе. Может быть, db2 имеет особое значение для подключения stdout к tty или консоли? Или, по крайней мере, не нравится, когда он подключен к трубе.

0 голосов
/ 11 февраля 2009

Попробуйте команду db2 с ключом -x:

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

У меня были случаи, когда это излечивало мою неспособность передать вывод в awk.

0 голосов
/ 04 февраля 2009

Это необычно, и, как говорит Пез, это, вероятно, причуды db2.

Я видел подобные проблемы, когда, например, используя time или timex перед строкой команды db2, где db2 не имеет определенной базы данных для подключения.

Существует переменная среды DB2DBDFT, которая устанавливает базу данных по умолчанию для неявных соединений. Мне жаль говорить, что я не уверен, доступна ли эта переменная пользователям, не являющимся администраторами баз данных (если вы разработчик приложений). Стоит исследовать, если установить эту переменную через:

db2set DB2DBDFT = $ {your_db_name}

И повторный запрос.

Если у вас есть несколько баз данных, к которым ваша среда может подключиться, вы можете сбросить переменную DB2DBDFT, как только закончите свою работу.

...