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脚本来加速任务的完成。