【Shell】使用Shell指令碼快速完成SQL指令碼中重複枯燥的任務
透過這個小文兒給大家展示一下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 --
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux/Unix shell 指令碼中呼叫SQL,RMAN指令碼Linux指令碼SQL
- 使用批處理指令碼或SHELL配合SQL指令碼指令碼SQL
- iOS逆向 Shell指令碼+指令碼重簽名iOS指令碼
- 快速建立分支Shell指令碼指令碼
- Shell指令碼中cd命令使用指令碼
- 使用shell指令碼生成只讀許可權的sql指令碼指令碼SQL
- shell指令碼指令碼
- 利用shell指令碼實現計劃任務功能指令碼
- [Shell] Shell 生成 HTML指令碼HTML指令碼
- 使用shell指令碼快速得到主備關係指令碼
- Linux執行shell指令碼完成任務計劃是以秒為單位Linux指令碼
- 9、在Shell指令碼中呼叫其他指令碼指令碼
- shell指令碼(二)指令碼
- shell指令碼心得指令碼
- shell指令碼案例指令碼
- 常用shell指令碼指令碼
- 巧用shell指令碼生成快捷指令碼指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- 利用shell指令碼生成動態sql指令碼SQL
- Shell指令碼中的 /Dev/Null 用途指令碼devNull
- linux shell指令碼中 =~ 的作用Linux指令碼
- Shell指令碼介紹與使用指令碼
- hive streaming 使用shell指令碼Hive指令碼
- 使用shell定製awr指令碼指令碼
- shell之最常用的服務指令碼指令碼
- 快速部署tomcat專案的Shell指令碼Tomcat指令碼
- shell動態指令碼和pl/sql動態指令碼的比較指令碼SQL
- 什麼是Shell指令碼?Shell指令碼在Linux運維工作中的地位!指令碼Linux運維
- Bash Shell指令碼中的陣列使用例項指令碼陣列
- 如何加密shell指令碼加密指令碼
- 初識shell指令碼指令碼
- 執行shell指令碼指令碼
- Shell 指令碼語句指令碼
- shell 指令碼加密 | shc指令碼加密
- Linux Shell指令碼Linux指令碼
- shell指令碼例項指令碼
- 【指令碼】shell語法指令碼
- shell指令碼舉例指令碼