免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7884 | 回复: 11
打印 上一主题 下一主题

[求助]shell脚本调用 isql 异常处理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-04 15:24 |只看该作者 |倒序浏览
我需要在shell 脚本中 调用   isql  进行一系列的数据库操作。
目前我不知道在isql中如何遇到错误立即退出整个 shell脚本 ,所以
我想通过下面的方法来实现。


首先当前脚本中 调用  isql 时  的错误输出重定向到 LOG文件中,包含 “SQLERROR"关键字。

我想在当前脚本开始时  向后台  提交一个命令,传入的是当前脚本的进程号,相当于创建一个子进程, 这个子进程的功能就是
检查 LOG的每条新增记录 ,如果包含 SQLERROR关键字 ,那么就通过传入的 进程号 杀死当前进程, 自己退出,如果检查到
约定的终止文本串(如 NORMAL_EXIT),则子进程退出。

当前shell脚本如果能执行到最后,则向LOG文件中输入约定的终止文本串(NORMAL_EXIT) ,子进程结束。



现在的问题就是
1. 这个方案可行不? 有没有更好的解决办法?
2. 本人很菜,不知上面的功能如何实现,达人给出流程中核心的命令提示下就好。
3  当前shell中  isql   每次调用都是向后读一段输入 并执行  遇到  约定的结束符(EOF)  才退出的  
    在一次调用过程中,如果中间的某条sql语句 产生了异常,导致向 日志中输出  SQLERROR ,那么
   按照上面的思路 是子进程 kill掉当前进程,而这时 当前进程仍在 调用isql, isql会立即终止吗?
   还是要执行完  整段 sql语句 才结束呢?我的本意是 某条sql产生错误则立即结束,而不在继续执行后续sql.

我能想到的就是


  1. #!/usr/bin/ksh
  2. LOG=logfile.log
  3. touch $LOG
  4. check_error()  //实现log文件错误检查功能
  5. {
  6.    调用 tail   grep 等命令实现
  7.    发现SQLERROR ,则调用 kill -9  $1
  8.    发现NORMAL_EXIT 则正常退出。
  9. }

  10. #创建子进程检查错误,传入父进程号
  11. check_error  $$   &

  12. #isql 调用
  13. isql  *********  <<EOF>> $LOG
  14. .
  15. .
  16. .
  17. .
  18. EOF
  19. #isql处理结束
  20. echo  "NORMAL_EXIT" >> $LOG
  21. return 0
复制代码

[ 本帖最后由 angus006 于 2009-12-4 15:54 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2009-12-04 15:32 |只看该作者

回复 #1 angus006 的帖子

你还是将你要执行的sql语句封装成一个存储过程吧,然后用shell去调用存储过程。
sql的错误由存储过程处理,出现异常则退出整个存储过程。

论坛徽章:
0
3 [报告]
发表于 2009-12-04 15:38 |只看该作者
貌似把语句写在单独的文件里面

1.sql

然后通过shell调用

#!/bin/sh
isql username/password@xxxx @1.sql > error.log

可能会比较方便一点

论坛徽章:
0
4 [报告]
发表于 2009-12-04 15:38 |只看该作者
#####

[ 本帖最后由 angus006 于 2009-12-4 17:03 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-12-04 15:40 |只看该作者
原帖由 ly5066113 于 2009-12-4 15:32 发表
你还是将你要执行的sql语句封装成一个存储过程吧,然后用shell去调用存储过程。
sql的错误由存储过程处理,出现异常则退出整个存储过程。



因为要进行很多与时间有关的 逻辑判断,,不同的路径执行不同的sql代码段,而且也要调用shell的命令 生成一些默认参数 ,传给sql ,所以还是需要这种解决方案的。

论坛徽章:
0
6 [报告]
发表于 2009-12-04 15:42 |只看该作者
##########

[ 本帖最后由 angus006 于 2009-12-4 15:43 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2009-12-04 15:43 |只看该作者

回复 #5 angus006 的帖子

时间判断 shell 会比 DB 方便?
你想用 shell 去管 DB 应该管的事,那就有的麻烦了。

论坛徽章:
0
8 [报告]
发表于 2009-12-04 15:43 |只看该作者
原帖由 CU_Solaris 于 2009-12-4 15:38 发表
貌似把语句写在单独的文件里面

1.sql

然后通过shell调用

#!/bin/sh
isql username/password@xxxx @1.sql > error.log

可能会比较方便一点

确实是这样的,写在当前shell中是因为有很多的环境变量要传到sql语句中 ,
我的问题是 一批sql中某个出错,如何立即退出整个脚本。

论坛徽章:
0
9 [报告]
发表于 2009-12-04 15:45 |只看该作者
原帖由 ly5066113 于 2009-12-4 15:43 发表
时间判断 shell 会比 DB 方便?
你想用 shell 去管 DB 应该管的事,那就有的麻烦了。



比如 每月倒数第二天执行  xxxx处理 这样的,还是shell判断方便些吧。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
10 [报告]
发表于 2009-12-04 15:55 |只看该作者

回复 #9 angus006 的帖子

mysql 不熟悉,Oracle 是有取一个月最后一天的函数的,在减1就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP