0

我有这个脚本,它从 SQL 查询中检索参数(一个数字)并将其分配给一个变量。有两个选项 - SQL 查询找到一个值,然后脚本执行回显“账单周期编号是 $v_bc”,或者它没有找到一个值,它假设回显“未找到账单周期参数”。我的 if 条件有问题。

这就是我想出的:

#!/bin/bash


v_bc=`sqlplus -s /@bscsprod <<EOF
set pagesize 0
select billcycle from bc_run
where billcycle not in (50,16)
and control_group_ind is null
and billseqno=6043;
EOF`


if [ -z "$v_bc" ]; then echo no billcycle parameter found                     
else echo "the billcycle parameter is $v_bc"
fi

当 billseqno=6043 时,则表示 v_bc=25,当我运行脚本时,结果为:“billcycle 参数为 25”。这就是我要做的。当我设置 billseqno=6042 时,根据上面的 SQL 查询,v_bc 将没有任何值,因此我想要它做的是 echo "no billcycle parameter found"。相反,我得到

“账单周期参数是

未选择任何行”。

有什么建议么 ?

非常感谢阿萨夫。

4

4 回答 4

1

您的代码正在正确检查空值 -v_bc只是不为空,即使使用-s.

您可以:

  • 解析sqplus没有返回行时的输出,因此添加以下内容:

    if [[ "$v_bc" == "no rows were selected" ]]; then v_bc=""; fi

    这使用[[ ]]带有“”的 bash 命令==进行模式匹配,因此我们无需担心前导/尾随空格。这不像 dogbane 那样健壮,SET FEEDBACK OFF因为“没有选择行”完全有可能成为有效数据。

  • 编写一个更好的查询,它总是返回数据,如下所示: http ://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:594023455752#followup-221571500346463844

    诀窍是重新格式化您的查询并将选择/联合与备用查询一起使用,当您的查询为空时有条件地提供输出:

 

with data as
  (select billcycle from bc_run where [...])
select * from data 
union all
select 'NA', null from dual where not exists (select null from data);

(另请参阅什么是 Oracle 中的对偶表?

于 2013-01-29T14:32:05.650 回答
0

尝试类似的东西

if [ "${v_bc:-SHOULDNTHAPPEN}" = "SHOULDNTHAPPEN" ]; then
  echo no billcycle parameter found
else......
于 2013-01-29T14:04:55.280 回答
0

尝试在 sqlplus 中关闭反馈,以便在未选择任何行时不会得到任何输出:

v_bc=`sqlplus -s /@bscsprod <<EOF
SET FEEDBACK OFF
set pagesize 0
select billcycle from bc_run
where billcycle not in (50,16)
and control_group_ind is null
and billseqno=6043;
EOF`
于 2013-01-29T14:20:23.343 回答
0

如果变量为空,则将值分配给变量的惯用方法是=在参数扩展中使用 an。换句话说,这:

: ${v_bc:=no billcycle paramter found}

相当于:

test -z "$v_bc" && v_bc='no billcycle paramter found'

在您的情况下,也很容易做到:

echo ${v_bc:-no billcycle parameter found}

但是标题中提出的问题并不是您的问题。(因为问题不在于v_bc空字符串,而在于它是您不期望的值。)

于 2013-01-29T16:23:25.943 回答