【Shell】使用Shell指令碼快速完成SQL指令碼中重複枯燥的任務

secooler發表於2009-11-05
透過這個小文兒給大家展示一下shell對SQL指令碼批次處理的小小魅力。

1.具體需求
現有成百上千個SQL指令碼檔案,每個檔案中均包含數量不等的insert語句。為保證在指令碼執行過程中有一個比較友好的輸出提示,需要在insert語句的前後新增一些輔助資訊(類似於PL/SQL Developer中匯出insert語句功能所提供的頭尾資訊)。

2.待處理SQL指令碼一例
insert into t values (1);
insert into t values (2);
insert into t values (3);

3.若按照需求完成輔助資訊新增後的效果如下
-- 2009-11-05 17:39:30 Generated by Seccooler.
set feedback off
set define off

prompt Loading  t ...

insert into t values (1);
insert into t values (2);
insert into t values (3);

prompt 3 records loaded
set feedback on
set define on


4.檔案數量眾多時將會遇到的問題
如果僅僅只有這一個檔案或只有比較少的幾個待編輯的檔案,完全可以透過手工來完成。但,如果待編輯的檔案成百上千,並且內容條數有長有短,“手工作坊”的方式顯然不合適了。至少會出現如下的問題。
1)人類的體力是有限的,很有可能在大量反覆的情況下體力枯竭;
2)人類的精力是有限的,很有可能在大量反覆的情況下精神崩潰;
2)即使體力無限,精力無限,在短暫的生命裡也有可能無法完成任務,因為一個人可能無法在地球上存在超過1000年;
3)人類這種動物是極易犯錯誤的,尤其是在枯燥的重複同樣的工作的情況下犯錯誤是不可避免的,這也符合“墨菲定律”;
4)其他問題請您自己補充。

5.告別“手工作坊”迎接“自動化時代”
$ vi format.sh
  1 #!/bin/bash
  2 for x in `find . -name "*.sql"`
  3 do
  4   echo "-- `date +"%Y-%m-%d %H:%M:%S"` Generated by Seccooler." > temp
  5   echo "set feedback off" >> temp
  6   echo "set define off" >> temp
  7   echo "" >> temp
  8   v_table_name=`head -1 $x | awk '{print $3}'`
  9   echo "prompt Loading  $v_table_name ..." >> temp
 10   echo "" >> temp
 11   cat $x |sed "s/^M//g" >> temp
 12   echo "" >> temp
 13   v_count=`grep -i "Insert into " $x | wc -l`
 14   echo "prompt $v_count records loaded" >> temp
 15   echo "set feedback on" >> temp
 16   echo "set define on" >> temp
 17   mv temp $x
 18 done
~

指令碼編寫的思路是:用最簡單的思路解決一個具體的問題。
重點解釋幾點:
第2行:自動化的體現,使用shell的for迴圈找到所有待處理的SQL指令碼檔案;
第4行:列印一行時間的標籤,並註釋是誰生成的指令碼;
第8-9行:使用變數v_table_name得到表名,列印輸出表名的資訊;
第11行:去掉DOS下的行尾回車符號“^M”;
第13-14行:統計SQL指令碼中一共存在多少條insert語句;
第17行:透過中間檔案temp實現覆寫原SQL指令碼檔案。

6.指令碼使用演示
從此再也不用為這個枯燥的體力工作苦惱了。當前資料夾及子資料夾中包含的指令碼檔案越多,越能發揮出指令碼的強大功能。

$ sh format.sh
$ cat test.sql
-- 2009-11-05 17:39:30 Generated by Seccooler.
set feedback off
set define off

prompt Loading  t ...

insert into t values (1);
insert into t values (2);
insert into t values (3);

prompt 3 records loaded
set feedback on
set define on

7.小結
如果發現一項任務需要反覆的重複同樣的內容,那麼這項工作一定可以使用一些自動化的手段來加速完成。
如果是單獨對同一個檔案的進行反覆執行同樣的編輯操作,那麼可以考慮錄製一段宏來完成。
如果是對多個檔案反覆執行同樣的編輯任務,則可以考慮使用shell指令碼來加速任務的完成。

Good luck.

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-618240/,如需轉載,請註明出處,否則將追究法律責任。

相關文章