Shell: enquanto a linha de leitura está aninhada

1

Eu tenho dois documentos: doc1.lst e doc 2.lst Eu quero pegar o conteúdo de cada linha e colocá-lo como parâmetros para minha consulta SQL.

Eu tentei algo assim, por favor corrija-me

    file=doc1.lst
    while read line
    do
       p1=$line;

    file=doc2.lst
    while read line
    do
       p2=$line;

        sqlplus64 $User/$Pass@$ORACLE_SID << EOF2
        @update.sql p1 p2

    done < echo "Ok"
    done < echo "Ok"
    EOF2

A coisa é que eu quero pegar o valor de cada linha e colocá-lo como um parâmetro (p1 e p2) para poder atualizar minha tabela como visto na consulta sqlplus.

Para um melhor entendimento, meu arquivo doc1.lst se parece com:

    AAA
    ABC
    EDF

E meu arquivo doc2.lst:

    30
    10
    30

Eu quero pegar esses valores para atualizar minha tabela.

    
por Julien S 11.03.2015 / 15:25

1 resposta

2

Pelo que entendi (o material <<EOF2 no final não é cristalino), o resultado final que você procura é alimentar o seguinte em sqlplus64 :

@update.sql AAA 30
@update.sql ABC 10
@update.sql EDF 30

Para produzir isso, em vez de fazer um loop sobre o conteúdo de ambos os arquivos, você pode combiná-los. Usando paste em ambos os arquivos ( paste doc1.lst doc2.lst ) fornece

AAA     30
ABC     10
EDF     30

( paste une-se às guias por padrão). Alterar o delimitador com paste -d ' ' doc1.lst doc2.lst fornece

AAA 30
ABC 10
EDF 30

Em seguida, precisamos adicionar @update.sql como um prefixo. isso pode ser feito com sed , substituindo o início de cada linha ( ^ ) pelo prefixo:

paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'

produz o resultado desejado.

Isso pode ser alimentado com um único disparo em sqlplus64 :

paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /' | sqlplus64 $User/$Pass@$ORACLE_SID

Se você precisar de exit no final do script alimentado em sqlplus64 :

(paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'; echo exit) | sqlplus64 $User/$Pass@$ORACLE_SID

Se você realmente quer executar as coisas linha por linha, você pode while read de cada linha do resultado e alimentar isso para sqlplus64 .

    
por 11.03.2015 / 15:42