Shell

變數類型的錯誤?

  • March 18, 2015

我有一個我不明白的錯誤,似乎問題在於我進入 shell 的參數與它們在我的 SQL 數據庫中的類型不同。

為了更好地理解:我有一個文件 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..

我真的不明白我必須在哪里以及如何進行修改。

Shell 所示:當嵌套讀取行時,您可以執行類似的操作

(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

無需解析每一行。

更安全的選擇是將整個文件轉換為 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

shell變數的設置應該在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 部分使用更新的值。

引用自:https://unix.stackexchange.com/questions/190928