如何在.sh脚本中验证SQL查询是否返回数据行
最优实现方案
分两种场景适配,你可以根据自己的需求选择:
场景1:需要使用查询返回的具体数据
直接基于你现有的逻辑,对存储结果的变量做非空判断即可,注意处理SQL返回可能携带的空白字符避免误判:
getResults(){ getAnyResults=`sqlplus -s $MMUSER/$MMPASS <<! set verify off set heading off set feedback off set pages 0 set pause off set linesize 2500 select x, y, z from A; exit; !` } # 执行查询 getResults # 可选:先判断是否有SQL执行错误,避免误判 if [[ "${getAnyResults}" =~ ORA-[0-9]+ ]]; then echo "SQL执行异常:${getAnyResults}" exit 1 fi # 去除所有空白字符后判断是否有返回内容 if [[ -n "${getAnyResults//[[:space:]]/}" ]]; then echo "查询有返回结果,执行对应操作" # 此处可添加处理getAnyResults的业务逻辑 else echo "查询无返回结果,执行另一操作" # 此处可添加无数据时的逻辑 fi
场景2:仅需要判断是否有数据,不需要使用返回的具体内容
可以对查询做性能优化,不需要拉取全表数据,只要判断是否存在至少一行即可,Oracle中用rownum=1可以查到第一条数据就终止查询,大幅提升大表场景下的执行效率:
# 封装判断函数,有数据返回0(成功状态码),无数据返回1(失败状态码) checkTableHasData(){ local checkRes=`sqlplus -s $MMUSER/$MMPASS <<! set verify off set heading off set feedback off set pages 0 set pause off select 1 from A where rownum = 1; exit; !` [[ -n "${checkRes//[[:space:]]/}" ]] } # 直接调用函数做分支判断 if checkTableHasData; then echo "表A存在数据,执行对应操作" else echo "表A无数据,执行另一操作" fi
注意事项
- 执行前请确保
$MMUSER、$MMPASS变量已正确赋值,避免数据库登录失败 - 用
[[:space:]]匹配所有空白字符(空格、换行、制表符等),比单独匹配空格兼容性更好
内容的提问来源于stack exchange,提问作者jct
相关产品推荐
相关产品推荐

