Executar uma consulta ao banco de dados, iterando os resultados de uma consulta anterior

1

Sou novo em scripts Unix e bash, então, por favor, descubra comigo se essa é uma pergunta boba.

Acabei de começar a trabalhar para uma empresa que usa o DB2 hospedado em uma plataforma Unix e há muitos esquemas indesejados em seus bancos de dados (criados pelo IBM Design studio). Eu quero limpar esses esquemas e estou assumindo que um script bash é a melhor maneira.

O que eu gostaria de fazer é consultar o banco de dados para obter os nomes dos esquemas e armazená-los em algum tipo de coleção; então percorra a coleção executando um comando drop para cada nome.

Eu estou bem com os comandos do DB2 (eu acho), mas não estou claro sobre como recuperar os resultados em um script.

Isso recuperará os nomes do esquema incorreto:

db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'"

Isso removerá o esquema onde o nome foi atribuído à variável $ SCHEMA_TO_DROP:

db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"

Tudo o que preciso fazer agora é vincular os dois juntos, mas não tenho certeza por onde começar?

    
por TeamWild 10.06.2015 / 12:52

3 respostas

1

# POSIX shell: command substitution, bash.info 3.5.4
# Sets SCHEMA_TO_DROP to the output of balh blah..
SCHEMA_TO_DROP="$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")"
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"

Atualização:

Assim como o visudo mencionou, o SCHEMA_TO_DROP capturado é, na verdade, uma lista. Você pode usar o loop for var in balh list para iterar na lista.

Usar $? pode ser desnecessário. Pessoalmente prefiro operações lógicas como || e && :

IFS='\n' # make sure that for don't split anything other then newlines
for foo in $SCHEMA_TO_DROP; do
    db2 something something || oh_crap_it_failed
done
    
por 10.06.2015 / 16:27
0

Você pode atribuir a saída de seleção a uma variável e, em seguida, iterar sobre cada schema_name usando um loop for.

/usr/bin/ksh

# Assign the output of the SELECT command to a local shell variable
SCHEMA_DROP_LIST=$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")

# Loop over each schema_name
for SCHEMA_TO_DROP in $SCHEMA_DROP_LIST
do
     # Drop the schema, 1 at a time
     db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"

done

Você também pode usar o $? variável imediatamente após o comando db2 drop para capturar o código de retorno e, em seguida, tomar uma ação com base nisso (ecoar o código de erro, sair etc).

    
por 10.06.2015 / 18:21
0

Já tentou usar uma subconsulta ? Provavelmente poderia ser algo como:

db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA((SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'), NULL, 'ST', 'ErrorTable')"

Mas precisaria lidar com vários valores no primeiro parâmetro.

    
por 10.06.2015 / 19:11

Tags