免费注册 查看新帖 |

Chinaunix

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

请教: sh调用sqlplus,如何获取sqlcode? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-22 10:07 |只看该作者 |倒序浏览
编写一个脚本,查询数据库并获取信息,然后根据信息做判断
现在问题是如果查询时的库表不存在之类的数据库出错信息不知道如何获取?

sh如下:
VALUE=`sqlplus -S $USRPWD <<EOF
set heading off feedback off pagesize 0 verify off echo off numwidth 4
    select col_1 from table_a where col_2='111' ;
exit
EOF`

if [ "$VALUE" = "XX" ] ----这里会有问题,$VALUE 可能是数据库的出错信息。如果判断是库表出错还是查询取出的结果?

谢谢~。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
2 [报告]
发表于 2009-09-22 11:04 |只看该作者
可以考虑看看VALUE变量里面是否含有匹配/^ORA-[0-9]\{5\}/(正则怎么合适怎么写,不需要这么死板,或者还可以限制得更严一点),如果匹配的话,就意味着前面的脚本有错。

还有种方法可能比较繁琐,写plsql,利用nds来避免因表不存在而引起的编译错误:

  1. declare
  2.     v_var1 varchar2(20);
  3.     v_cnt number;
  4. begin
  5.     select count(*) into v_cnt from user_tables where table_name='TABLE_A';
  6.     if v_cnt =1 then
  7.       execute immediate 'select col_1 into v_var1 from table_a where col_2=''111''';
  8.     else
  9.       dbms_output.put_line('Table does not exist.'); -- 表不存在的情况下在这里可以决定怎么处理可以让后续的shell脚本更好判断问题,当然如果用dbms_output.put_line的话,前面sqlplus的设置还需要set serveroutput on
  10.     end if;
  11. exception
  12.     when others then
  13.       dbms_output.put_line(sqlerrm);
  14. end;
  15. /
复制代码

[ 本帖最后由 Minsic 于 2009-9-22 11:14 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-09-22 16:23 |只看该作者
用了简单的方法:

VALUE=`sqlplus -S $USRPWD <<EOF
set heading off feedback off pagesize 0 verify off echo off numwidth 4
select col_1 from table where col_2='xxx';
exit
EOF`

yy=`echo $VALUE|cut -c 1-6`

if [ "$yy" = "select" ]  ------------------------如果表不存在等数据库错误,错误信息以sql开头.所以如果select打头就当出错
then
     。。。。
else
    if [ "$VALUE" = "" ] ------------------------未找到匹配的记录

论坛徽章:
0
4 [报告]
发表于 2009-09-22 16:25 |只看该作者
谢谢 Minsic  
:)

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
5 [报告]
发表于 2009-09-22 17:30 |只看该作者

回复 #4 yangdon323 的帖子

不客气

只是如果取select开头就错误,处理这个特定的例子特定的错误可能没问题,我个人觉得还是找一个合适的正则来匹配比较合适。

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
6 [报告]
发表于 2009-09-23 20:27 |只看该作者
也可以这么做:

  1. sqlplus /nolog <<EOF
  2. connect user/pass;
  3. whenever sqlerror exit sql.sqlcode;
  4. select * from tab;
  5. EOF
复制代码

然后检查$?来判断表是否存在。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
7 [报告]
发表于 2009-09-24 16:07 |只看该作者

回复 #6 syncpk99 的帖子

sqlplus原来还有whenever命令,受益匪浅,感谢楼上的。

赶紧去查了下sqlplus user guide,发现不止有whenever sqlerror,甚至还有whenever oserror,以后写类似的脚本又多了一种很好的选择,再次感谢

论坛徽章:
0
8 [报告]
发表于 2009-09-24 16:30 |只看该作者
sqlplus /nolog > /dev/null  <<EOF
connect bill0/bill0a@telf;
whenever sqlerror exit 1;
EOF

我用户名密码是bill0a/bill0a

我这里echo $?显示的总是0呢?

帮忙看看我哪写的不对呢

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
9 [报告]
发表于 2009-09-24 16:39 |只看该作者

回复 #8 ghostgorst 的帖子

里面的两句反了

论坛徽章:
0
10 [报告]
发表于 2009-09-24 16:41 |只看该作者

回复 #9 Minsic 的帖子

:wink: 没看明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP