Eu escrevi um bloco de código abaixo
#!/bin/bash
TABLE_NAME="${1}"
COL_NAME="${2}"
FIELD_VALUES_1SQ_FUNC()
{
FIELD_VALUES_1SQS=`sqlplus -s sab/admin@TERM << EOF
SET FEEDBACK OFF;
SET HEADING OFF;
Select TESTING.FIELD_VALUES_TEMP_1SQ.NEXTVAL from dual;
exit;
EOF`
FIELD_VALUES_1SQ=`echo ${FIELD_VALUES_1SQS} | tr -d ' '`
}
RT_SEQ_CHECK_FUNC()
{
RT_SEQ_CHECKS=`sqlplus -s sab/admin@TERM << EOF
SET FEEDBACK OFF;
SET HEADING OFF;
Select * from TESTING.FIELD_VALUES where FIELD_ROW_ID='${1}' and TF_ID='${2}';
exit;
EOF`
RT_SEQ_CHECK=`echo ${RT_SEQ_CHECKS} | tr -d ' '`
}
RT_FIELD_IDS_FUNC()
{
RT_FIELD_IDS=`sqlplus -s sab/admin@TERM << EOF
SET HEADING OFF;
SET FEEDBACK OFF;
select max(TF_ID) from TESTING.TABLE_FIELD where field_id in(select field_id from TESTING.FIELD_DOMAIN where name='${2}') and table_id in (select table_id from TESTING.TABLE where name='${1}');
EXIT;
EOF`
RT_FIELD_ID=`echo ${RT_FIELD_IDS} | tr -d ' '`
}
FIELD_VALUES_1SQ_FUNC
RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
if [ -z "${RT_SEQ_CHECK}" ]
then
echo "Sequence values doesn't exist |--${RT_SEQ_CHECK}--|"
else
echo "SEQUNCE VAlue exists |--${RT_SEQ_CHECK}--|"
fi
echo "TF_ID=${FIELD_VALUES_1SQ}"
echo "FIELD_ROW_ID=${RT_FIELD_ID}"
exit $?
No meu script, inicialmente estou chamando a função FIELD_VALUES_1SQ_FUNC
para gerar um número de sequência.
Em segundo lugar, estou chamando RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
onde obterá algum valor.
Terceiro, a função RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
é chamada, onde ela verifica se o valor está lá no banco de dados. Se o valor estiver lá, devo chamar o FIELD_VALUES_1SQ_FUNC()
novamente para gerar um novo valor de sequência e verificá-lo com RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
a função, a menos que o valor não seja encontrado para esse select na FIELD_VALUES_1SQ_FUNC()
função.
Alguma ideia de como isso pode ser alcançado!
O que você está procurando é chamado de
while
loop. Considere este exemplo simples:Um loop while faz duas coisas e, por implicação, o programador deve fazer uma terceira coisa.
n
menor que 5?Se a condição for verdadeira, então:
while
loop é executado uma vezwhile
loop volta ao passo 1 e testa a condição novamenteSe a condição não for verdadeira, o loop termina e a execução do script continua com a instrução que segue a palavra-
done
chave do loop.A terceira coisa, que é de responsabilidade do programador, é fazer algo dentro do corpo do loop que irá (ou poderá) alterar o status da expressão condicional. No exemplo simples acima, essa etapa é a
n = $(($n+1))
instrução. Sem isso, o loop se tornará infinito porque a condição é inicialmente verdadeira e nunca muda. Tente executar o script com essa linha comentada e veja o que acontece. Em seguida, pressione CtrlC.Para adaptar este exemplo ao seu problema específico, acho que você deve negar o teste
[ -z "${RT_SEQ_CHECK}" ]
para suawhile
condição. Com isso, quero dizer que quando[ -z "${RT_SEQ_CHECK}" ]
for true, isso significa que${RT_SEQ_CHECK}
é comprimento zero, e é quando você deseja parar de fazer o loop. Felizmentetest
tem a-n
opção que é exatamente o oposto da-z
opção.Então, em termos muito amplos, seu
while
loop ficará assim:Finalmente, tenho o que espero que seja um comentário construtivo sobre a estrutura do seu código. Você tende a usar variáveis globais para retornar um valor de uma função e, em seguida, refere-se a essas variáveis globais no corpo principal do seu código. Isso pode tornar o código difícil de ler e seguir. Em vez de codificar neste estilo:
Tente isto:
Novamente, aplicar esse código pode resultar em algo assim: