ITPub博客

首页 > 数据库 > Oracle > 【Shell】使用Shell脚本快速完成SQL脚本中重复枯燥的任务

【Shell】使用Shell脚本快速完成SQL脚本中重复枯燥的任务

原创 Oracle 作者:OCMU联盟 时间:2009-11-05 20:07:06 0 删除 编辑
通过这个小文儿给大家展示一下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博客 ” ,链接:https://blog.itpub.net/70034820/viewspace-2994007/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
OCM联盟( Oracle Certified Master Union)是由侯圣文(ACE总监)发起的一个公益组织,旨在为每一个OCM大师提供一个可以继续展示自己才华,技术和实力的平台。

注册时间:2007-05-27

  • 博文量
    799
  • 访问量
    8407012