SQL*Plusがロードするglogin.sqlが検索されるパスを探る


SQL*Plusが起動すると、glogin.sqlスクリプトが自動的に動作します。このファイルは主に各ユーザー共通の環境設定用に用いられます。
Oracle Database 12c Release 2に付属するSQL*Plusを使って、どのディレクトリに保存されたglogin.sqlが使われるかを検証しました。

# 標準設定の場合
ORACLE_HOMEとPATHのみ指定された環境でSQL*Plusを起動した場合、どのディレクトリのglogin.sqlを検索するか確認しました。
ORACLE_HOME/sqlplus/adminディレクトリを検索しています。マニュアル通りの動きです。

```
$ strace sqlplus scott/tiger
(略)
stat("/u01/app/oracle/product/12.2.0/dbhome_1/sqlplus/admin/glogin.sql", 0x7ffde7a6b200) = -1 ENOENT (No such file or directory)
(略)
```

# SQLPATHを指定
[SQL*Plusユーザーズ・ガイドおよびリファレンス・マニュアル](https://docs.oracle.com/cd/E82638_01/SQPUG/configuring-SQL-Plus.htm#GUID-5A2953BF-9E2F-450B-AFBA-EE2846C59B5E) にはSQLPATHは以下のように説明されています。

>SQLスクリプトの位置を指定する環境変数またはWindowsレジストリ・エントリ。SQL*Plusでは、SQLPATHで指定されたディレクトリおよびSQLPATHディレクトリのサブディレクトリに、SQLスクリプト(login.sqlを含む)が検索されます。

glogin.sqlが検索されるかを確認します。

```
$ export SQLPATH=/home/oracle/dir1:/home/oracle/dir2:/home/oracle/dir3
$ strace sqlplus scott/tiger
(略)
stat("/u01/app/oracle/product/12.2.0/dbhome_1/sqlplus/admin/glogin.sql", 0x7ffd69385180) = -1 ENOENT (No such file or directory)
brk(0)                                  = 0x2042000
brk(0x207a000)                          = 0x207a000
stat("/home/oracle/dir1/?/sqlplus/admin/glogin.sql", 0x7ffd6937f1b0) = -1 ENOENT (No such file or directory)
stat("/home/oracle/dir2/?/sqlplus/admin/glogin.sql", 0x7ffd6937f1b0) = -1 ENOENT (No such file or directory)
stat("/home/oracle/dir3/?/sqlplus/admin/glogin.sql", 0x7ffd6937f1b0) = -1 ENOENT (No such file or directory)
write(1, "SQL> ", 5SQL> )                    = 5
(略)

```
なぜかSQLPATHに指定されたディレクトリを検索し、それぞれのディレクトリ以下の「?/sqlplus/admin/glogin.sql」を検索していることがわかります。


# ORACLE_PATHを指定

[SQL*Plusユーザーズ・ガイドおよびリファレンス・マニュアル](https://docs.oracle.com/cd/E82638_01/SQPUG/configuring-SQL-Plus.htm#GUID-5A2953BF-9E2F-450B-AFBA-EE2846C59B5E) にはORACLE_PATHは以下のように説明されています。

> SQLスクリプトの位置を指定する環境変数。SQL*PlusがORACLE_PATHでスクリプト・ファイルを検出できない場合、またはORACLE_PATHが設定されていない場合は、現行の作業ディレクトリが検索されます。 

glogin.sqlが検索されるかを確認します。

```
$ export ORACLE_PATH=/home/oracle/dir1
$ strace sqlplus scott/tiger
(略)
access("/home/oracle/dir1/login.sql", F_OK) = -1 ENOENT (No such file or directory)
access("/home/oracle/dir1/login.sql", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 143360, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5c6152000
munmap(0x7fa5c6152000, 143360)          = 0
stat("/u01/app/oracle/product/12.2.0/dbhome_1/sqlplus/admin/glogin.sql", 0x7ffd43ec0000) = -1 ENOENT (No such file or directory)
(略)
```

login.sqlが検索されていますが、glogin.sqlはデフォルトのみ検索されています。

# 両方を設定してみる

ORACLE_PATHとSQLPATHを別々のディレクトリに指定して、glogin.sqlが検索されるか確認しました。

```
export SQLPATH=/home/oracle/dir1:/home/oracle/dir2
export ORACLE_PATH=/home/oracle/dir3
strace sqlplus scott/tiger
(略)
access("/home/oracle/dir3/login.sql", F_OK) = -1 ENOENT (No such file or directory)
access("/home/oracle/dir3/login.sql", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 143360, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbdc8a30000
munmap(0x7fbdc8a30000, 143360)          = 0
stat("/u01/app/oracle/product/12.2.0/dbhome_1/sqlplus/admin/glogin.sql", 0x7ffee6774900) = -1 ENOENT (No such file or directory)
brk(0)                                  = 0x21d5000
brk(0x220d000)                          = 0x220d000
stat("/home/oracle/dir1/?/sqlplus/admin/glogin.sql", 0x7ffee676e930) = -1 ENOENT (No such file or directory)
stat("/home/oracle/dir2/?/sqlplus/admin/glogin.sql", 0x7ffee676e930) = -1 ENOENT (No such file or directory)
(略)
```

両方設定してもglogin.sqlを検索するのはSQLPATHで指定したディレクトリのみでした。マニュアルには環境変数SQLPATHとglogin.sqlスクリプトの関係について記述が無いため検証してみました。