Um erro do tipo de variável?

2

Eu tenho um erro que eu não entendo, parece que o problema é que meus parâmetros no shell não são do mesmo tipo que eles são no meu banco de dados SQL.

Para um melhor entendimento: Eu tenho um arquivo doc.lst onde eu tenho três coisas importantes em cada linha separadas por espaços e eu quero usar essas coisas como parâmetro para um UPDATE no meu banco de dados. Cada linha será lida, cada parte será usada como parâmetro e atualizará meu banco de dados.

Eu tenho uma consulta SQL:

    UPDATE PE P
    SET P.DATED='&1', P.DATEF='&1', P.CODA='&3', P.CODB='&2'
    WHERE P.G_BAT=1;
    COMMIT;

E um shell que é:

    IFS=$'\n'
    for i in $(cat $LST_HOME/doc.lst)
    do 
    sqlplus64 $User/$Pass@$ORACLE_SID << EOF
    P1=$(echo $i | awk '{print $1}')
    P2=$(echo $i | awk '{print $2}')
    P3=$(echo $i | awk '{print $3}')
    @$SQL_HOME/update_p.sql $P1 $P2 $P3
    commit;
    exit
    /data/jdk1.6.0_XX/bin/java -cp fr.bla.bla.bla 
    EOF

Eu recebi este erro:

    SQL> SP2-0734: unknown command at the beggining of "P1=12/03/2..." - end of the line is ignored.
    SQL> SP2-0042: unknown command "P2=0" - end of the line is ignored..
    SQL> SP2-0042: unknown command "P3=FSL" - end of the line is ignored..

Eu realmente não entendo onde e como fazer modificações.

    
por Julien S 18.03.2015 / 11:00

2 respostas

3

Como indicado em Shell: enquanto a linha de leitura aninhada , você pode faça algo como

(sed "s|^|@${SQL_HOME}/update_p.sql |" ${LST_HOME}/doc.lst; echo exit) | sqlplus64 ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}

Se você quiser executar um comando após cada atualização do SQL, poderá fazer um loop, embora haja várias restrições (globbing, etc.). Se os valores no seu doc.lst estiverem seguros, você pode fazer

while read line; do
    (echo @${SQL_HOME}/update_p.sql ${line}; echo exit) | sqlplus64 ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}
    /data/java_1.6_XX/bin/java -cp fr.bla.bla.bla
done < ${LST_HOME}/doc.lst

sem precisar analisar cada linha.

Uma opção mais segura é transformar todo o arquivo em um script de shell:

sed "s|^|(echo @${SQL_HOME}/update_p.sql |" ${LST_HOME}/doc.lst | sed "s/$/; echo exit | sqlplus64/" | sed "s|$| ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}; /data/java_1.6_XX/bin/java -cp fr.bla.bla.bla|" > doc.script
sh doc.script
    
por 18.03.2015 / 11:14
4

configuração da variável shell deve ser feita antes da chamada sqlplus

IFS=$'\n'
for i in $(cat $LST_HOME/doc.lst)
do 
P1=$(echo $i | awk '{print $1}')
P2=$(echo $i | awk '{print $2}')
P3=$(echo $i | awk '{print $3}')

sqlplus64 $UserCoribudg/$PassCoribudg@$ORACLE_SID << EOF
@$SQL_HOME/update_p.sql $P1 $P2 $P3
commit;
exit
EOF

/data/java_1.6_XX/bin/java -cp fr.bla.bla.bla

done
  • P1=whatever não é um código sql válido.
  • Eu assumo que a parte java faz uso de valores atualizados.
por 18.03.2015 / 11:08