[英]spool multiple files in loop of shell script
我正在嘗試后台處理多個文件以減少手動工作。
SQL 文件 (spool_csv.sql) 有一個 select 語句,我需要將其作為 CSV 文件進行假脫機,如下所示
set colsep ','
set linesize 9999
set trimspool on
set heading on
set pagesize 0 embedded on
set wrap off
set feedback off
set newpage 0
set verify off
set arraysize 5000
SET TERMOUT OFF
spool C:\Users\spool_csv\csv_03\csv_file_03-jan_&1..csv
select * from CRAFT_MVT_H where code = '&1';
spool off;
exit;
然后我有簡單的 shell 腳本 (spool_csv.sh),它循環遍歷一個文件以將參數傳遞給 SQL 文件並在運行時更改假脫機文件的名稱以及 SELECT 語句的 where 子句。
for line in `cat chartfield1_03.txt`
do
echo $line
sqlplus -s user/password@SID @spool_03.sql $line
done
chartfield1_03.txt 包含——
778
769
741
728
739
759
737
752
710
734
747
我需要為 chartfield1_03.txt 的每一行(比如值)有單獨的 csv 文件
所以它會像
csv_file_03-jan_778.csv
csv_file_03-jan_769.csv
csv_file_03-jan_741.csv
and so on....
但是當我運行 shell 腳本時,它只創建一個用於 chartfield1_03.txt 最后一行的 CSV 文件,即 csv_file_03-jan_747.csv
我不確定為什么在我將假脫機文件作為參數傳遞並在循環中調用它時沒有創建其他文件,因此每次它都應該打開一個新的 SQL 會話並創建新的假脫機文件。
請幫助我理解我在這里缺少什么!!
所以最后我發現了為什么它不工作,因為我在 SQLPLUS 命令中錯過了 EOF 在添加如下后它工作正常。
我找到的解決方案。
#!/bin/bash
for line in `cat chartfield1_03.txt`
do
echo $line
dt1 = `sqlplus -s HEW/hew_dba14@DEVHEW<<EOF
whenever sqlerror exit sql.sqlcode;
@spool_03.sql $line;
EOF` &
done
一種可能的解決方案是在每次sqlplus
執行時創建相同的文件並在 shell 中重命名它。 為此,您可以更改行:
spool C:\Users\spool_csv\csv_03\csv_file_03-jan_&1..csv
成為
spool C:\Users\spool_csv\csv_03\csv_file_03-jan_..csv
並在shell腳本中:
sqlplus -s user/password@SID @spool_03.sql $line
成為
sqlplus -s user/password@SID @spool_03.sql
mv "C:\Users\spool_csv\csv_03\csv_file_03-jan_..csv" "C:\Users\spool_csv\csv_03\csv_file_03-jan_${line}.csv"
我的解決方案。
如果您有任何其他解決方案,請提供任何其他解決方案:)
#!/bin/bash
for line in `cat chartfield1_03.txt`
do
echo $line
dt1 = `sqlplus -s HEW/hew_dba14@DEVHEW<<EOF
whenever sqlerror exit sql.sqlcode;
@spool_03.sql $line;
EOF` &
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.