スポンサーリンク

バッチで末尾にスラッシュ「/」があるsqlを呼ぶと2回実行される原因とPLSQLなら1回実行の理由

バッチで末尾にスラッシュ「/」がある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回は実行されない。