SQL*Plus の新機能を試す（Oracle Database 23ai）

# SQL*Plus の新機能
　本記事では Oracle Database 23ai に附属の SQL*Plus に実装された新機能を検証します。
 AUTOTRACE に SQL 文の変更アドバイスが出力される機能は [[SQL Adviser Report 機能を試す（Oracle Database 23ai）](https://qiita.com/plusultra/items/c71319722032fad10b9d)] で紹介しましたので、それ以外の新機能について記載しています。

# CONFIG
CONFIG コマンドは tnsnames.ora ファイルの内容を JSON 形式で出力します。CONFIG EXPORT TNS までは固定で、追加オプションにより動作が変わります。

```SQL: CONFIG コマンドのデフォルト実行
SQL> CONFIG EXPORT TNS
ローカル・ネット・ネーミング構成ファイル/opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.oraの構成ストアJSONを生成しています

{
    "FREE": {
        "connect_descriptor": "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr23ai)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = freepdb1)))"
    },
    "LISTENER_FREE": {
        "connect_descriptor": "(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr23ai)(PORT = 1521))"
    }
}
```

AZURE 句を指定すると、Oracle Database Service for Azure 用の JSON 出力が生成されます。

```SQL: CONFIG コマンドに AZURE 句を指定
SQL> CONFIG EXPORT TNS AZURE
ローカル・ネット・ネーミング構成ファイル/opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.oraの構成ストアJSONを生成しています

{
"orcl/FREE/connect_descriptor": "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr23ai)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = freepdb1)))",
"orcl/LISTENER_FREE/connect_descriptor": "(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr23ai)(PORT = 1521))"
}
```

tnsnames.ora ファイルを読み込むディレクトリ名は環境変数 TNS_ADMIN または $ORACLE_HOME/network/admin がデフォルトです。変更したい場合はディレクトリのパスを指定します。


```SQL: ディレクトリを指定
SQL> CONFIG EXPORT TNS /home/oracle/tnsadmin
ローカル・ネット・ネーミング構成ファイル/home/oracle/tnsadmin/tnsnames.oraの構成ストアJSONを生成しています

{
    "FREE2": {
        "connect_descriptor": "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr23ai)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = freepdb1)))"
    },
    "LISTENER_FREE": {
        "connect_descriptor": "(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr23ai)(PORT = 1521))"
    }
}
```


ファイルに出力する場合は FILE 句と同時にパスを指定します。ディレクトリを指定しない場合は SQL*Plus を実行したカレント・ディレクトリに作成されます。ファイル名も省略した場合にはカレントディレクトリに oraconfig.json ファイルが生成されます。

```SQL: CONFIG コマンドの結果をファイルに出力
SQL> CONFIG EXPORT TNS FILE /tmp/tnsnames.json
ローカル・ネット・ネーミング構成ファイル/opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.oraの構成ストアJSONを生成しています
構成ストアJSONファイルが正常に生成されました(/tmp/tnsnames.json)
```

マニュアル上には出力ファイルに「JSON ファイル名」の形式が書かれていますが、この句を指定するとカレントディレクトリの JSON ディレクトリに oraconfig.json ファイルを作成しようとします。また出力ファイルの拡張子を json 以外にすると、ディレクトリ名と判断するようです。

```SQL: 出力ファイルの拡張子を変更するとエラー
SQL> CONFIG EXPORT TNS FILE test.out
SP2-1692: JSONファイル(test.out/oraconfig.json)の作成に失敗しました。
ヘルプ: https://docs.oracle.com/error-help/db/sp2-1692/
```

マニュアル 
[13.16 CONFIG](https://docs.oracle.com/en/database/oracle/oracle-database/23/sqpug/config.html#GUID-BA14D871-2310-4206-B335-52E8783D04B6)

# SHOW CONNECTION
SHOW CONNECTION NETSERVICEMAMES コマンドは tnsnames.ora ファイルの内容を出力します。短縮形として SHOW CONN NETS を使用できます。
パラメーターを指定しない場合、tnsnames.ora ファイルのサービス名一覧を出力します。

```SQL: デフォルトの動作
SQL> SHOW CONNECTION NETSERVICENAMES
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
FREE
LISTENER_FREE
```

サービス名を指定すると、tnsnames.ora ファイルのサービス詳細を出力します。大文字／小文字は区別されません。サービス名は複数回指定できます。

```SQL: サービス名を指定
SQL> SHOW CONNECTION NETSERVICENAMES FREE
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
FREE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr23ai)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = freepdb1)))

```

マニュアル 
[13.47 SHOW CONNECTION](https://docs.oracle.com/en/database/oracle/oracle-database/23/sqpug/show-connection.html#GUID-5231AA9A-85CC-4AB8-AC7B-4C2251763452)

# OERR
OERR コマンドは Oracle Database 23c で追加されたコマンドで、オペレーティング・システム上の oerr コマンドを SQL*Plus 内から実行できます。ファシリティとして TNS を指定するとエラーが発生する不具合がありましたが、Oracle Database 23ai Free でも修正されていません。このためシンボリックリンクを作成して回避します。

```SQL: OERR コマンドのエラー回避
SQL> OERR TNS 12154
SP2-0160: "/opt/oracle/product/23ai/dbhomeFree//network_src/mesg/tnsus.msg"をオープンできません。
ヘルプ: https://docs.oracle.com/error-help/db/sp2-0160/
SQL> !
$ cd $ORACLE_HOME/
$ ln -s network network_src
$ exit

SQL> OERR TNS 12154
Message: "Cannot connect to database. Cannot find alias %s in %s."
ヘルプ: https://docs.oracle.com/error-help/db/tns-12154/
Cause:  A connection to a database or other service is being requested
        using a connection alias but the alias specified cannot be resolved
        into a connect descriptor using one of the configured naming
        methods.
...
```

# マニュアルの記載
Oracle Database 23ai のマニュアルを見ると、Oracle Database 23c は無かったことにされています。このため、新機能の説明には Oracle Database 23c と Oracle Database 23ai の新機能が一緒に記載されています。

[Changes in This Release for Oracle Database SQL*Plus User's Guide and Reference
](https://docs.oracle.com/en/database/oracle/oracle-database/23/sqpug/changes-this-release-sqpug.html#GUID-B891207E-99B0-4796-AA76-E1AF4B587436)

Author: Noriyoshi Shinoda / Date: June 6, 2024