2009-02-04 7 views
0

Я пытающийся выполнить следующую команду в Kornshell (КШ):Awk, как представляется, отсоединение DB2 сессии конвейеру

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?

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

Заранее спасибо.

ответ

1

В этом случае, когда 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, чем о системном каталоге, иначе я бы рекомендовал некоторые простые запросы каталога для получения того же результата.

+0

Отлично! Это помогло, спасибо, Фред. – greggannicott

+0

Так же, как и в стороне: моя грязная работа для этой попытки (которая сама по себе могла быть классифицирована как грязная работа) заключалась в том, чтобы запустить db2look и использовать awk для моделирования многострочной grep (что-то, что не может сделать в ksh с помощью grep) Мне удалось получить список индексов. – greggannicott

+0

Утилита db2look - это хороший способ генерировать полный DDL для объектов, но если вас интересует только то, о чем идет речь, в представлении SYSCAT.INDEXES много полезной информации. –

1

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

+0

В качестве теста, что происходит, когда вы запускаете «db2 ... | awk ...» в качестве простой команды в командной строке? Кроме того, привыкнуть использовать $ (...) вместо backticks; гораздо проще управлять цитированием. Поскольку обратные выходы захватывают выход (через файл или трубу), неясно, что проблема с трубопроводом в awk. –

+0

Hi Jonathan Извините за задержанный ответ. Я только что заметил этот комментарий. Когда команда «db2 | awk» выполняется за пределами обратных тактов, она работает так, как ожидалось. – greggannicott

0

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

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

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

db2set DB2DBDFT = $ {} your_db_name

И повтора вашего запроса.

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

+0

Спасибо за ваши ответы. Я поговорю с нашими администраторами баз данных и расскажу, что вы предложили. Когда я впервые показал это нашим администраторам баз данных, они просто пожали плечами. Имея это в виду, еще раз спасибо за то, что нашли время ответить. – greggannicott

0

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

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

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

+0

Справедливая точка. К сожалению, я начал с ключа -x. По какой-то причине я не включил его в свой пример выше. Спасибо за попытку! – greggannicott