Pergunta

Eu estou tentando executar o seguinte comando em KornShell (ksh):

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

O que eu estou tentando alcançar é o lugar uma lista dos índices sobre uma tabela específica em uma matriz que eu possa mais tarde iterate através de.

O problema é, quando eu executar o comando acima (que a conexão de banco de dados não existe, que está me dizendo) o conteúdo da matriz começa com a mensagem de erro de 'SQL1024N'.

No entanto, se eu remover o awk no final da declaração assim:

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

ele funciona muito bem (bem, na medida em que está retornando dados. Obviamente, sem a awk Não estou capturando os dados corretos).

Alguém sabe por que o awk está tendo isso afeta?

Eu aprecio há mais de uma maneira de obter esses dados, mas me deixa perplexo por que isso está acontecendo.

Agradecemos antecipadamente.

Foi útil?

Solução

Neste caso, quando o DB2 CLP diz que não está conectado ao banco de dados, é porque o shell abriu um sub-processo que requer o seu próprio processo servidor dedicado db2bp, que não pode acessar a conexão aberta pelo shell originais processo. Não é que algo está sendo desligado, é que um processo shell recém-criado (e seu processo db2bp acompanhamento) estão sendo criadas, mas não estão sendo orientados a se conectar a um banco de dados. Uma maneira de remediar isso é explicitamente connect (ou re-connect) para o banco de dados quando você sabe que está em uma dessas situações.

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

Sei que esta questão é mais sobre scripting e awk com o DB2 que sobre o catálogo do sistema, ou então eu teria recomendado algumas consultas catálogo simples para produzir o mesmo resultado.

Outras dicas

Eu duvido do awk per se. Talvez DB2 é particular sobre stdout sendo conectado a um tty ou console? Ou pelo menos não gosta quando ele está conectado a um tubo.

Este é um passo incomum, e, como diz Pez é provavelmente uma peculiaridade do DB2.

Já vi problemas semelhantes quando, por exemplo, usando o tempo ou timex antes de uma seqüência de comandos do DB2, em que o DB2 não tem um banco de dados definida para se conectar.

Há uma variável DB2DBDFT ambiente que define um banco de dados padrão para conexões implícitas. Lamento dizer que eu não tenho certeza se esta variável está disponível para usuários não-DBA (presumindo que você é um desenvolvedor de app). Vale a pena investigar se a definição desta variável via:

db2set DB2DBDFT = $ {your_db_name}

E repetindo sua consulta.

Se você tiver vários bancos de dados de seu ambiente poderia ligar para você pode retirar a variável DB2DBDFT depois de ter concluído o seu trabalho.

Tente o comando do DB2 com o parâmetro -x:

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

Eu tive casos em que isso tenha curado minha incapacidade de produção de tubos de awk.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top