0

SQL クエリからパラメーター (数値) を取得し、それを変数に割り当てるこのスクリプトがあります。2 つのオプションがあります。SQL クエリが値を見つけてから、スクリプトが "the billcycle number is $v_bc" をエコーするか、値が見つからず、"no billcycle parameter found" をエコーすることを前提としています。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 です」という結果になります。それが私がやろうとしていることです。上記のSQLクエリによると、billseqno = 6042を設定すると、v_bcは値を取得しないため、「billcycleパラメーターが見つかりません」とエコーします。代わりに私は得る

「ビルサイクルパラメータは

行が選択されていません。」

助言がありますか ?

どうもありがとうアサフ。

4

4 に答える 4

1

あなたのコードは空の値を正しくチェックしていますv_bc- -s.

次のいずれかを実行できます。

  • 行が返されない場合の出力を解析するsqplusため、これを追加します。

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

    これは、パターン マッチングに " " を含む bash[[ ]]コマンドを使用==するため、先頭/末尾の空白について心配する必要はありません。SET FEEDBACK OFFこれは、「行が選択されていない」ことが有効なデータである可能性が十分にあるため、dogbane ほど堅牢ではありません。

  • 次のように、常にデータを返すより良いクエリを作成します

    トリックは、クエリを再構築し、クエリが空の場合に条件付きで出力を提供するフォールバック クエリで select/union を使用することです。

 

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

Try turning feedback off in sqlplus so that you don't get any output if no rows are selected:

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

変数が空の場合に変数に値を割り当てる慣用的な方法は=、パラメーター展開で を使用することです。言い換えれば、これは:

: ${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 に答える
0

次のようなものを試してください

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