シェル変数をSQL文に渡したいと思います。シェルスクリプトとSQL文の両方が同じスクリプトファイルに存在します。
変数の値retMonth
とretLastDay
SQL文が必要です。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
ラインがどのように機能するかです。しかし、$lastMonth
WHERE文などを拡張したくないので、バックスラッシュで引用する必要があります。ここでは、一重引用符は特別な目的はありません。
しかし、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
)