2014-01-22 58 views
2

我有一個需求,我需要編寫一個ksh腳本,它將命令行參數讀入數組,並創建DML語句以將記錄插入到oracle數據庫中。我已經創建了一個腳本來實現這一點。但是,調用腳本的用戶無權寫入腳本必須運行的目錄。那麼,有沒有一種方法可以在數據庫上觸發多次插入,而無需在循環中多次連接sqlplus,同時又不會像下面那樣創建臨時sql文件?任何想法都非常感謝。提前致謝!連接到sqlplus只有一次而沒有寫入循環中的文件

i=0 
while ((i<$src_tbl_cnt)) 
do 
echo "insert into temp_table values ('${src_tbl_arr[$i]}', ${ins_row_arr[$i]}, ${rej_row_arr[$i]});" >> temp_scrpt.sql 
((i+=1)) 
done 
echo "commit; disc; quit" >> temp_scrpt.sql 
sqlplus user/[email protected] @ temp_scrpt.sql 

回答

0

只需使用/ tmp目錄。

/tmp目錄保證存在於任何unix系列服務器上。正是這樣的需求在那裏。絕對做一些事情,比如在文件名中添加當前的進程ID,這樣多個用戶就不會互相踩在一起。所以總的名字就像/tmp/temp_$PID_scrpt.sql或類似的東西。

完成後,一定要刪除該文件 - 比如說,在sqlplus調用後面的一行中。因此,一定要將文件名存儲在變量中,並刪除該變量中的內容。

它應該不用說,但在一家運行良好的商店:1)管理員應該在/ tmp中放置足夠多的空間,2)社區中的所有用戶都不應該刪除/ tmp中的其他文件或超載它,所以它用完了空間。 3)管理員應該設置一個作業,在某個時間之後從/ tmp刪除文件,這樣如果腳本在刪除臨時文件之前失敗了,它將不會永遠存在。

所以真的,這個答案更多的是關於/ tmp和有效管理 - 但這真的是你需要的。使用臨時文件是一種強大的技術,所以你的設計很好。用戶通常無權擁有目錄的現實很常見,所以/ tmp就是你的答案。

+0

很抱歉,如果我原來的問題聽起來誤導,但值得關注的更多的是正在運行的所有insert語句在連接到只有一次在sqlplus和運行時「沒有」寫所有INSERT語句成文件。 – user3221849

0

除了創建一個臨時文件外,您還可以在shell腳本中直接將輸入生成塊的輸出管道化爲sqlplus。

實施例:

{ 
    echo 'set auto off;' 
    for ((i=0; i<100; i++)); do 
    echo "insert into itest(i) values ($i);" 
    done 
    # echo 'rollback;' # for testing 
    echo 'commit;' 
} | sqlplus -S juser/[email protected] > /dev/null 

這適用於KSH 93和擊(或許甚至與KSH 88模的((表達式語法)。

的測試表中相應的DDL語句:

create table itest (i number(36)) ; 

PS:順便說一下,最好甚至當創建一個臨時文件 - 重定向輸出方式比做追加式重定向每個更有效線,如:

{ for ((i=0; i<100; i++)); do echo "line $i"; done; echo end; } > foo.tmp