SQLPlusのスクリプトに渡した引数を更に内部で渡したいとき

ハマったのでメモ。

こんな3つのスクリプトがあるとする。

--first_script.sql
START second_script.sql "TODAY IS" '&1'
START third_script.sql '&1' "IS TODAY"
--second_script.sql
echo '&1' '&2'
--therd_script.sql
echo '&1' '&2'

で、 ↓のようにコマンドを叩いたとき、

START first_script.sql "20240120"

こういう結果を期待していた。

--second_script.sqlの結果
TODAY IS 20240120
--&1がTODAY ISで、&2が親スクリプトに渡した引数
--third_script.sqlの結果
20240120 IS TODAY
--&1が親スクリプトに渡した引数で、&2がIS TODAY

が、やってみるとこうなってしまった。

--second_script.sqlの結果
TODAY IS 20240120
--second_script.sqlの結果
TODAY IS IS TODAY

なぜこうなってしまうのかというと、
second_script.sqlを呼び出したときに、&1が、
second_script.sqlの&1であるTODAY ISに上書きされてしまうらしい。
スクリプトを呼び出した時の&1は引き継がれない。

これを回避するには、親スクリプトを呼び出したときの&1を共通変数にして、
secondとthirdではそれを参照するようにすればよい。

--first_script.sql
DEFINE my_variable = '&1'
START second_script.sql "TODAY IS"
START third_script.sql "IS TODAY"
--second_script.sql
SET SERVEROUTPUT ON
echo '&1' '&my_variable'
--therd_script.sql
SET SERVEROUTPUT ON
echo '&my_variable' '&1'