シェル変数をSQL文に渡す

シェル変数をSQL文に渡す

シェル変数をSQL文に渡したいと思います。シェルスクリプトとSQL文の両方が同じスクリプトファイルに存在します。

変数の値retMonthretLastDaySQL文が必要です。retPrvYear以下はコードです。

echo $retMonth  //This prints 07
echo $retLastDay //This prints 31
echo $retPrvYear  //This prints 2015

count=$(sqlplus -s  ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID} <<END
#connect ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID}
set serveroutput on
set linesize 1000
set heading off
set feedback off
define lastMonth=$retMonth
define lastYear=$retPrvYear
define lastDay=$retLastDay
SELECT count(1)
FROM MYTABLE
WHERE partition_date between '01-$lastMonth-$lastYear' and '$lastDay-$lastMonth-$lastYear'
  );
END
)

これを実行すると、次のように印刷されます。

partition_date between '01--' and '--' \ 0 0] 1 1] 12-DEC-14 1"

答え1

使用するときこれは<<END$variable 文字列拡張がすべて完了しました。これがdefineラインがどのように機能するかです。しかし、$lastMonthWHERE文などを拡張したくないので、バックスラッシュで引用する必要があります。ここでは、一重引用符は特別な目的はありません。

しかし、sqlplusは&を使用して&DEFINE変数を拡張しているようです。

WHERE partition_date between '01-&lastMonth-&lastYear' and '&lastDay-&lastMonth-&lastYear'

答え2

sqlplus変数の拡張に間違いを犯したようです。&代わりに使用する必要があります$

ただし、SQL変数を完全に使用せずにシェル変数を直接使用できます。

count=$(sqlplus -s  ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID} <<END
#connect ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID}
set serveroutput on
set linesize 1000
set heading off
set feedback off
SELECT count(1)
FROM MYTABLE
WHERE partition_date between '01-$retMonth-$retPrvYear' and '$retLastDay-$retMonth-$retPrvYear'
  );
END
)

拡張SQLコードを印刷してcatこの問題を直接デバッグできます。sqlplus

echo $(cat <<END
...
END
)

関連情報