Oracle Database 23c：外部表でJSON型の列がサポートされたので試してみた

# はじめに

Oracle Database 23cから、外部表でJSON型の列が使用できるようになったので試してみました。

# 1.JSONデータの準備

こちらの記事と同じ方法で、v$parameterビューからJSONデータを含むテキストファイル json_data.txt を作成し、/tmpに配置しました。

https://qiita.com/500InternalServerError/items/0d894cbbb6e9a44e9e06#2%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8Bjson%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E6%88%90

json_data.txt のサイズを確認します。
```
[oracle@basedb23c ~]$ ls -l /tmp/json_data.txt 
-rwxr-xr-x 1 oracle oinstall 70861 Oct 17 14:00 /tmp/json_data.txt
```
json_data.txt の内容を確認します
```
[oracle@basedb23c ~]$ tail /tmp/json_data.txt 
{"name":"uniform_log_timestamp_format","type":1,"value":"TRUE","isDefault":"TRUE","description":"use uniform timestamp formats vs pre-12.2 formats"}
{"name":"use_dedicated_broker","type":2,"value":"NONE","isDefault":"TRUE","description":"Use dedicated connection broker"}
{"name":"use_large_pages","type":2,"value":"only","isDefault":"FALSE","description":"Use large pages if available (TRUE/FALSE/ONLY)"}
{"name":"user_dump_dest","type":2,"value":"/u01/app/oracle/product/23.0.0.0/dbhome_1/rdbms/log","isDefault":"TRUE","description":"User process dump directory"}
{"name":"wallet_root","type":2,"value":"/opt/oracle/dcs/commonstore/wallets/db23c_476_iad","isDefault":"FALSE","description":"wallet root instance initialization parameter"}
{"name":"workarea_size_policy","type":2,"value":"AUTO","isDefault":"TRUE","description":"policy used to size SQL working areas (MANUAL/AUTO)"}
{"name":"xml_client_side_decoding","type":2,"value":"true","isDefault":"TRUE","description":"enable/disable xml client-side decoding"}
{"name":"xml_db_events","type":2,"value":"enable","isDefault":"TRUE","description":"are XML DB events enabled"}
{"name":"xml_handling_of_invalid_chars","type":2,"value":"raise_error","isDefault":"TRUE","description":"Handle invalid chars during xmlelement"}
{"name":"xml_params","type":2,"value":null,"isDefault":"TRUE","description":"Parameters to alter xml behavior"}
[oracle@basedb23c ~]$ 
```
json_data.txt の行数を確認します。
```
[oracle@basedb23c ~]$ wc -l /tmp/json_data.txt 
535 /tmp/json_data.txt
```
535行あることがわかりました。

# 2. ディレクトリ・オブジェクトの作成

/tmp をポイントするディレクトリ・オブジェクト json_data_dir を作成します。
```
SQL> CREATE OR REPLACE DIRECTORY json_data_dir AS '/tmp';

Directory JSON_DATA_DIR created.

SQL>
```
ディレクトリ・オブジェクト json_data_dir が作成されました。

# 3. JSON型の列を含む外部表の作成
/tmp/json_data.txt を元にしたJSON型の列を含む外部表 json_data_ext を作成します。
```
SQL> CREATE TABLE json_data_ext 
  2      (json_data      JSON)
  3  ORGANIZATION EXTERNAL(
  4      TYPE ORACLE_LOADER
  5      DEFAULT DIRECTORY json_data_dir
  6      ACCESS PARAMETERS (
  7          RECORDS DELIMITED BY 0x'0A'
  8          FIELDS (json_data CHAR(4000))
  9     )
 10      LOCATION ('json_data.txt')
 11* );

Table JSON_DATA_EXT created.

SQL> 
```
外部表 json_data_ext が作成されました。

# 4. 外部表に対するクエリの実行

外部表json_data_extのレコード数を確認します。
```
SQL> SELECT COUNT(*) FROM json_data_ext;

   COUNT(*) 
___________ 
        535 

SQL>
```
json_data.txt の行数と同じ535であることがわかりました。

ドット表記法を使用して、プロパティnameがsessionsであるJSONドキュメントを外部表 json_data_ext から抽出してみます。
```
SQL> SELECT JSON_SERIALIZE(json_data PRETTY) json_data
  2  FROM json_data_ext j
  3* WHERE j.json_data.name = 'sessions';

JSON_DATA                                                                                                                           
___________________________________________________________________________________________________________________________________ 
{
  "name" : "sessions",
  "type" : 3,
  "value" : "624",
  "isDefault" : "TRUE",
  "description" : "user and system sessions"
}    

SQL>
```
プロパティnameがsessionsであるJSONドキュメントを抽出されました。

外部表でJSON型の列が使用できることが確認できました。

# 参考情報
・[Oracle Database 23c : CREATE DIRECTORY](https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIRECTORY.html)
・[Oracle Database 23c : CREATE TABLE](https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html)
・[Loading External JSON Data](https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/loading-external-json-data.html#GUID-52EFC452-5E65-4148-8070-1FA588A6E697)