変数の型が間違っていますか?

変数の型が間違っていますか?

理解できないエラーがあります。問題は、シェルに入力したパラメーターがSQLデータベースに入力したパラメーターとは異なるタイプのようです。

理解を助けるために、各行にスペースで区切られた3つの重要な内容を持つdoc.lstファイルがあり、これらの内容をデータベース更新のパラメータとして使用したいと思います。各行を読み取り、各部分をパラメータとしてデータベースを更新します。

SQLクエリがあります。

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

シェルは次のとおりです。

    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

このエラーがあります。

    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..

どこでどのように修正するのか本当にわかりません。

答え1

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有効なSQLコードではありません。
  • Java部分が更新された値を使用しているとします。

答え2

に示すようにシェル:入れ子になった行を読みながら、あなたは次のことができます

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

各SQL更新後にコマンドを実行したい場合は、いくつかの注意事項(ワイルドカードなど)がありますが、ループを実行できます。あなたの価値がdoc.lst安全であれば、これを行うことができます

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

すべての行を解析する必要はありません。

より安全なオプションは、ファイル全体をシェルスクリプトに変換することです。

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

関連情報