バッチで末尾にスラッシュ「/」があるsqlを呼ぶと2回実行される原因とPLSQLなら1回
現象
バッチファイルで、sqlplusでsqlを呼び出すと、2回実行される現象が発生したため、原因の調査をした。
sqlplusで呼び出したsqlファイルは、下記のような1文のクエリ。
これを呼び出すと、クエリが2回実行される。
select * from tbl; /
下記のようなPLSQLブロックをバッチファイルからsqlplusを実行する時は、1回だけの実行だけだった。
DECLARE value NUMBER; BEGIN select * from tbl; END ; /
2回実行される理由
下記参考サイトによると、
単独のSQLで末尾に「/」を使うと、 SQL バッファに直前に実行したクエリ情報を保存して、再実行する仕組みらしく、
その影響で2回実行されていた。
RUN - オラクル・Oracle SQL*Plus リファレンス
RUN は画面に現在の SQL バッファの内容を表示した後、実行を行なうためのコマンド - 短縮形は R
PLSQLだと1回な理由
PLSQLのBEGIN~ENDのブロックの末尾に「/」を入れれば、
そのPLSQLブロックの終端文字という意味となり、2回は実行されない。