2011-04-26 50 views
2

我想從bash中的文件加載sql並執行加載的sql。該sql文件需要是多功能的,這意味着它不能被改變,以便在bash中運行時容易(轉義特殊字符如*) 因此,我遇到了一些問題:從bash中的文件執行SQL

如果我讀了我的示例。 SQL

SELECT * FROM SAMPLETABLE 

給一個變量與

ab=`cat sample.sql` 

並執行它

db2 `echo $ab` 

我收到一個sql錯誤,因爲通過執行一個cat,*已被sample.sql的目錄中的所有文件取代。

簡單的解決方案是將「」替換爲「\」。但我不能這樣做,因爲該文件需要保持可執行程序,如DB Visualizer等

有人能給我提示正確的方向嗎?

+1

因爲你沒有引用你的變量'''(echo「$ ab」)'',所以'*'正在擴大。但請使用下面的答案之一。 – 2011-04-26 15:10:57

回答

2

從文件中重定向stdin。

db2 < sample.sql 
3

DB2命令行處理器具有接受文件名作爲輸入選項,所以你不應該需要從一個文本文件加載語句進入一個shell變量。

該命令將執行所有SQL語句中的文件,以作爲語句終止治療的新行:

db2 -f sample.sql 

該命令將執行所有SQL語句中的文件,以作爲語句終止處理分號:

db2 -t -f sample.sql 

其他有用的CLP標誌是:

  • -x:Suppr ESS列標題
  • -v:回聲語句文本之前執行
  • -z:三通所有CLP輸出到文件名的副本立即這個標誌下面
2

在情況下,你有一個變量在你的腳本中使用,並希望得到它取代由DB2之前執行的外殼,然後用這個辦法:的File.sql

內容:

cat <<xEOF 
insert values(1,2) into ${MY_SCHEMA}.${MY_TABLE}; 
select * from ${MY_SCHEMA}.${MY_TABLE}; 
xEOF 

在命令提示符下執行:

export MY_SCHEMA='STAR' 
export MY_TAVLE='DIMENSION' 

那你都是很好的得到它在DB2執行:

eval File.sq |db2 +p -t 

外殼將取代全局變量,然後DB2將執行它。 希望它有幫助。