SQLclの動作を環境変数で変えてみる (Oracle Database 12c Release 2付属)


Oracle Database 12c Release 2に付属するSQLcl (12.2.0.1) が実行時に参照し、動作を変更できる環境変数を調べてみました。調査はRed Hat Enterprise Linux 7 Update 3にOracle Database 12c Release 2 Enterprise Editionをインストールし、最新のPSUを適用した状態で実施しました。

# SQLclの起動
日本語環境でSQLclを起動すると以下のようなメッセージが出力されます。

```
$ sql / as sysdba

SQLcl: 月 5 21 10:47:40 2018のリリース12.2.0.1.0 RC

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

接続先:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


SQL>

```

# 環境変数

## LANG
SQLclの起動メッセージのエンコードは環境変数NLS_LANGではなく、LANGで指定したコードが使用されます。セッションのNLS関連パラメーターのデフォルト値も変更されます。起動パラメーターとしてOCIインターフェースを用いる-ociを指定した場合でも同じ動作をするようです。

LANGを日本語に設定した例。

```
$ export LANG=ja_JP.utf8
$ sql / as sysdba

SQLcl: 月 5 21 10:51:27 2018のリリース12.2.0.1.0 RC

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

接続先:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


SQL> SHOW PARAMETER nls
NAME                    TYPE   VALUE
----------------------- ------ --------------------------
nls_calendar            string GREGORIAN
nls_comp                string BINARY
nls_currency            string \
nls_date_format         string RR-MM-DD
nls_date_language       string JAPANESE
nls_dual_currency       string \
nls_iso_currency        string JAPAN
nls_language            string JAPANESE
nls_length_semantics    string BYTE
nls_nchar_conv_excp     string FALSE
nls_numeric_characters  string .,
nls_sort                string BINARY
nls_territory           string JAPAN
nls_time_format         string HH24:MI:SSXFF
nls_time_tz_format      string HH24:MI:SSXFF TZR
nls_timestamp_format    string RR-MM-DD HH24:MI:SSXFF
nls_timestamp_tz_format string RR-MM-DD HH24:MI:SSXFF TZR
SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
--------
18-05-21

SQL>
```

LANGを英語にした例。

```
$ export LANG=en_US.utf8
$ sql / as sysdba

SQLcl: Release 12.2.0.1.0 RC on Mon May 21 10:52:21 2018

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


SQL> SHOW PARAMETER nls
NAME                    TYPE   VALUE
----------------------- ------ ----------------------------
nls_calendar            string GREGORIAN
nls_comp                string BINARY
nls_currency            string $
nls_date_format         string DD-MON-RR
nls_date_language       string AMERICAN
nls_dual_currency       string $
nls_iso_currency        string AMERICA
nls_language            string AMERICAN
nls_length_semantics    string BYTE
nls_nchar_conv_excp     string FALSE
nls_numeric_characters  string .,
nls_sort                string BINARY
nls_territory           string AMERICA
nls_time_format         string HH.MI.SSXFF AM
nls_time_tz_format      string HH.MI.SSXFF AM TZR
nls_timestamp_format    string DD-MON-RR HH.MI.SSXFF AM
nls_timestamp_tz_format string DD-MON-RR HH.MI.SSXFF AM TZR
SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
---------
21-MAY-18

SQL>


```

## JAVA_HOME
SQLclはJavaを使って開発されているため、内部ではjavaコマンドが動作します。インストールされた Java Runtimeのディレクトリを指定する環境変数がJAVA_HOMEです。
この環境変数が指定されていない場合、環境変数JAVA_HOMEにはORACLE_HOME/jdkが使用されます。
以下の例はRed Hat Enterprise Linuxのパッケージに含まれるOpenJDK 1.8を指定する例です。

```
$ export JAVA_HOME=/usr
$ sql / as sysdba

SQLcl: 月 5 21 10:58:54 2018のリリース12.2.0.1.0 RC

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

接続先:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


SQL> ! ps -ef|grep java
oracle     8421   8416 65 10:58 pts/0    00:00:03 /usr/bin/java -Djava.awt.headless=true -Dapple.awt.UIElement=true -Xss10M -Djava.net.useSystemProxies=true -client -cp /u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/lib/extensions/*:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc8.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc8.jar:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc7.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc7.jar:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc6.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc6.jar:/u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/lib/oracle.sqldeveloper.sqlcl.jar: oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli / as sysdba
oracle     8465   8421  0 10:58 pts/0    00:00:00 bash -c SQLCLTERM=`stty -g 2>/dev/null` ; stty sane 2>/dev/null;  export PATH="/u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/bin:$PATH" && ps -ef|grep java; SQLCLEXIT=$? ; if test "M$SQLCLTERM" != "M" ; then stty "$SQLCLTERM" 2>/dev/null ; fi; exit $SQLCLEXIT
oracle     8470   8465  0 10:58 pts/0    00:00:00 grep java

SQL>
```

Java Runtimeとして/usr/bin/javaコマンドが実行されていることがわかります。

## DEBUG
Java Runtimeのデバッグモードを設定するオプションを指定します。
以下の例はDEBUGに-Xdebugを指定しています。環境変数DEBUGが指定されると、SQLcl起動時に環境変数の値が表示されるようになります。
ただし、JAVA_HOMEは表示されず、コマンドのパスがJAVAとして表示されます。

```
$ export DEBUG=-Xdebug
$ sql / as sysdba
JAVA=/usr/bin/java
STD_ARGS=-Djava.awt.headless=true -Dapple.awt.UIElement=true -Xss10M -Djava.net.useSystemProxies=true
JAVA_OPTS=
DEBUG=-Xdebug
CPLIST=/u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/lib/extensions/*:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc8.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc8.jar:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc7.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc7.jar:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc6.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc6.jar:/u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/lib/oracle.sqldeveloper.sqlcl.jar:

SQLcl: 月 5 21 11:03:17 2018のリリース12.2.0.1.0 RC

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

接続先:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


SQL>
```
## JAVA_OPTS
標準以外のJava Runtimeのオプションを指定する場合に使います。
デフォルトでは以下のオプションが指定されます。

1. -Djava.awt.headless=true
2. -Dapple.awt.UIElement=true
3. -Djava.net.useSystemProxies=true
4. -Xss10M
5. -client
6. -cp 	{ORACLE_HOME}sqldeveloper/sqlcl/lib/extensions/*,
       	{ORACLE_HOME}/jdbc/lib/ojdbc8.jar
	{ORACLE_HOME}/ojdbc8.jar
	{ORACLE_HOME}/jdbc/lib/ojdbc7.jar
	{ORACLE_HOME}/ojdbc7.jar
	{ORACLE_HOME}/jdbc/lib/ojdbc6.jar
	{ORACLE_HOME}/ojdbc6.jar
	{ORACLE_HOME}/sqldeveloper/sqlcl/lib/oracle.sqldeveloper.sqlcl.jar

JAVA_OPTSに指定されたオプションは、-clientと${DEBUG}の間に指定されます。下記の例は-Xincgcを指定しています。

```
$ export DEBUG=-Xdebug
$ export JAVA_OPTS=-Xincgc
$ sql / as sysdba
JAVA=java
STD_ARGS=-Djava.awt.headless=true -Dapple.awt.UIElement=true -Xss10M -Djava.net.useSystemProxies=true
JAVA_OPTS=-Xincgc
DEBUG=-Xdebug
CPLIST=/u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/lib/extensions/*:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc8.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc8.jar:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc7.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc7.jar:/u01/app/oracle/product/12.2.0/dbhome_1/jdbc/lib/ojdbc6.jar:/u01/app/oracle/product/12.2.0/dbhome_1/ojdbc6.jar:/u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/lib/oracle.sqldeveloper.sqlcl.jar:
OpenJDK 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release

SQLcl: 月 5 21 11:13:28 2018のリリース12.2.0.1.0 RC

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

接続先:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


SQL>
```

## ORACLE_HOME
ORACLE_HOMEはJava Runtimeの検索に使用されます。ORACLE_HOMEが指定され、JAVA_HOMEが指定されていない場合、
JAVA_HOMEとしてORACLE_HOME/jdk/jreが指定されます。
また、ORACLE_HOMEが指定されている場合、JDBC Driverの検索パスとしてORACLE_HOMEとORACLE_HOME/jdbc/libが追加され、
LD_LIBRARY_PATHも変更されます。