SQL*PlusでSQLファイルを実行するコマンド「@」と「@@」の違いです。
@と@@の違い
まず「@hoge」のように、パス無し(ファイル名のみ)で実行すると以下のようにhoge.sqlファイルを探しに行きます。
①SQL*Plusを実行時のカレントディレクトリ
(例)C:\mydir>sqlplus~ ⇒C:\mydirがカレントディレクトリ
②環境変数「SQLPATH」で定義されているディレクトリ
(例)C:\mydir>sqlplus~ ⇒C:\mydirがカレントディレクトリ
②環境変数「SQLPATH」で定義されているディレクトリ
- 見つからない場合は以下のようなエラーとなります。
- SQL> @hoge SP2-0310: ファイル"hoge.sql"をオープンできません。
「@C:¥hoge」のようにパスありで指定すれば、そのファイルが直接実行されます。
「@」と「@@」の違いは、sqlファイルからさらに別のsqlファイルを呼んだ場合に影響してきます。
例えば、カレントディレクトリでもSQLPATHに定義したディレクトリでもない場所に、以下2ファイルを作成して「@」で実行するとエラーとなります。
- (aa.sql)
- @bb.sql
- (bb.sql)
- select sysdate from dual;
- 実行例
- SQL> @c:\aa SP2-0310: ファイル"bb.sql"をオープンできません。
これは aa.sql が bb.sql を呼ぶときに、bb.sql をカレントディレクトリまたは、SQLPATHからのみ探し、aa.sqlと同じディレクトリは探さないためです。
呼び出し元の aa.sql と同じディレクトリも検索対象に含めたい場合は「@」ではなく「@@」を使用します。
- (aa.sql)
- @@bb.sql SQL> @c:¥aa SYSDATE -------- 18-06-20
実行されました。
解説
- @も@@もファイル名のみ指定した場合のみカレントディレクトリまたはSQLPATHを参照します
- パスも指定した場合はそのパスのみ参照します