OCIのBase Database（Oracle Database 19c）に対して、サンプルスキーマをインストールする

# はじめに
Oracle Databaseの学習の一環で、サンプルスキーマをインストールする
デフォルトではインストールされていないため、新規に構築したBaseDBに対してインストールする
＊[こちら](https://docs.oracle.com/cd/F19136_01/comsc/lot.html)のマニュアルを参考にしています。

# サンプルスキーマの概要
> https://docs.oracle.com/cd/F19136_01/comsc/introduction-to-sample-schemas.html#GUID-E47F3547-0498-46BF-856A-FBBD42844B6B
> - スキーマHR – 人事管理(Human Resources)部門では、会社の従業員および施設に関する情報を管理しています。
> - スキーマOE – 受注(Order Entry)部門では、様々なチャネルにわたる、会社の製品の在庫と販売を管理しています。
> - スキーマPM – 製品メディア(Product Media)部門では、会社が販売する各製品に関する説明書と詳細情報を管理しています。
> - スキーマIX – 情報交換(Information Exchange)部門では、B2Bアプリケーションを使用して出荷を管理しています。
> - スキーマSH – 販売(Sales)部門では、ビジネス上の判断に役立つ事業統計を管理しています。
> - COスキーマ - 顧客注文(Customer Orders)部門では、顧客、製品、店舗および注文のデータで構成される簡単な小売アプリケーションがモデル化されています。

:::note warn
スキーマSHは、Partitioningオプションがライセンスに必要なため、Standard Editionでは利用ができません。
そのため、Base DatabaseではPartitioningが利用できるHigh Performance以上のライセンスが必要となります。
:::


# インストールしてみる
## 前提
- Base Database
- データベース・バージョン: 19.21.0.0.0
- ソフトウェア・エディション:Standard Edition
- PDB名は"DB0206_pdb1"

## PDBでログインできるようにする
PDBのサービス名を確認
```shell
$ sudo su - oracle #oracleユーザに切替

$ lsnrctl status | tail #PDB名から始まる末尾のサービス名を確認
  Instance "DB0206", status READY, has 2 handler(s) for this service...
Service "DB0206XDB.subnet01191039.vcn01191039.oraclevcn.com" has 1 instance(s).
  Instance "DB0206", status READY, has 1 handler(s) for this service...
Service "DB0206_DB0206_pdb1.paas.oracle.com" has 1 instance(s).
  Instance "DB0206", status READY, has 2 handler(s) for this service...
Service "DB0206_jh5_nrt.subnet01191039.vcn01191039.oraclevcn.com" has 1 instance(s).
  Instance "DB0206", status READY, has 2 handler(s) for this service...
Service ★"db0206_pdb1.subnet01191039.vcn01191039.oraclevcn.com" has 1 instance(s).　#こちらのサービス名をコピー
  Instance "DB0206", status READY, has 2 handler(s) for this service...
The command completed successfully
```

tnsnames.oraファイルを編集
```shell
$ vim $ORACLE_HOME/network/admin/tnsnames.ora
```

末尾に、既存のCDB宛ての接続を参考に、PDB接続を追記し保存してください。
```sql
#tnsnames.oraNetworkConfigurationFile:/u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/tnsnames.ora
#GeneratedbyOracleconfigurationtools.
LISTENER_DB0206=(ADDRESS=(PROTOCOL=TCP)(HOST=zrcvtest)(PORT=1521))
DB0206_JH5_NRT=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zrcvtest)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=DB0206_jh5_nrt.subnet01191039.vcn01191039.oraclevcn.com)))
IFILE=/opt/oracle/dcs/commonstore/dbrs/DB0206_jh5_nrt/dbrsnames.ora
-- 以下追加
PDB=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zrcvtest)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db0206_pdb1.subnet01191039.vcn01191039.oraclevcn.com))) 
```

作成した接続名とsysユーザでログインできること、接続先がPDBになっていることを確認
```shell
$ sqlplus sys@PDB as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 10 13:36:01 2024
Version 19.21.0.0.0

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

Enter password:

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.21.0.0.0

SQL> show con_name

CON_NAME
------------------------------
DB0206_PDB1
```

この作業をしないとデフォルトではCDBに対してログインされてしまいます。
以後PDB内にsysユーザでログインしている前提で話を進めます。

## HRスキーマだけインストールする場合
HRスキーマはスクリプトがBaseDB内に既に用意されています

PDBにログイン
```shell
$ sqlplus sys@PDB as sysdba
```

スクリプトの実行
```sql
SQL> @?/demo/schema/human_resources/hr_main.sql

specify password for HR as parameter 1:
Enter value for 1: WelCome123#123# --任意でパスワード入力(大文字や文字数など要件があるので注意)

specify default tablespeace for HR as parameter 2:
Enter value for 2: users --HRのデフォルトの表領域

specify temporary tablespace for HR as parameter 3:
Enter value for 3: temp --HRの一時表領域

specify log path as parameter 4:
Enter value for 4: $ORACLE_HOME/demo/schema/log/ --ログのパス


/*
省略
*/


Commit complete.


PL/SQL procedure successfully completed.
```
"completed"で終了していればOK

HRユーザでログインできることを確認して、
```shell
$ sqlplus HR/WelCome123#123#@PDB
```

テーブルが格納されていることも確認
```sql
SQL> show con_name

CON_NAME
------------------------------
DB0206_PDB1
SQL> show user
USER is "HR"
SQL> SELECT table_name FROM user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
COUNTRIES

7 rows selected.

```

正しくインストールできた


## 他のサンプルスキーマもインストールする場合
HRスキーマ以外のものをインストールしたい場合は、Githubよりスクリプトをインストールさせる必要があります。

https://github.com/oracle-samples/db-sample-schemas


スクリプトのダウンロード＆解凍
```shell
$ cd $ORACLE_HOME/demo/
$ wget https://github.com/oracle-samples/db-sample-schemas/archive/refs/tags/v19.2.tar.gz
$ tar xzvf v19.2.tar.gz
$ cd db-sample-schemas-19.2/
$ ls #正しく解凍されているか確認
bus_intelligence  drop_sch.sql     LICENSE.md  mksample.sql  order_entry    README.txt
CONTRIBUTING.md   human_resources  mk_dir.sql  mkunplug.sql  product_media  sales_history
customer_orders   info_exchange    mkplug.sql  mkverify.sql  README.md      shipping
$ perl -p -i.bak -e 's#__SUB__CWD__#'$(pwd)'#g' *.sql */*.sql */*.dat  #おまじない
```

PDBにログイン
```shell
$ sqlplus sys@PDB as sysdba
```

スクリプトの実行
```sql
SQL> @?/demo/db-sample-schemas-19.2/mksample.sql
specify password for SYSTEM as parameter 1:
Enter value for 1: WelCome123#123# --既に決められた値を入力

specify password for SYS as parameter 2:
Enter value for 2: WelCome123#123# --既に決められた値を入力

specify password for HR as parameter 3:
Enter value for 3: WelCome123#123# --任意

specify password for OE as parameter 4:
Enter value for 4: WelCome123#123# --任意

specify password for PM as parameter 5:
Enter value for 5: WelCome123#123# --任意

specify password for IX as parameter 6:
Enter value for 6: WelCome123#123# --任意

specify password for  SH as parameter 7:
Enter value for 7: WelCome123#123# --任意

specify password for  BI as parameter 8:
Enter value for 8: WelCome123#123# --任意

specify default tablespace as parameter 9:
Enter value for 9: users

specify temporary tablespace as parameter 10:
Enter value for 10: temp

specify log file directory (including trailing delimiter) as parameter 11:
Enter value for 11: $ORACLE_HOME/demo/schema/log/

specify connect string as parameter 12:
Enter value for 12: PDB  --接続識別子(tnsnames.oraに記載した項目)

```

新しくスキーマが作成されていることが確認できた
```SQL
$ sqlplus OE/WelCome123#123#@PDB


SQLcl: Release 21.4 Production on Sat Feb 10 14:45:10 2024

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

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.21.0.0.0

SQL> SELECT table_name FROM user_tables;

                       TABLE_NAME
_________________________________
CUSTOMERS
WAREHOUSES
ORDER_ITEMS
ORDERS
INVENTORIES
PRODUCT_INFORMATION
PRODUCT_DESCRIPTIONS
PROMOTIONS
PRODUCT_REF_LIST_NESTEDTAB
SUBCATEGORY_REF_LIST_NESTEDTAB

10 rows selected.

SQL>
```

備考：各テーブルのレコード数を確認する
```SQL
SELECT table_name, num_rows FROM user_tables;
```

一発で入力させるコマンド
```sql
@?/demo/db-sample-schemas-19.2/mksample.sql WelCome123#123# WelCome123#123# WelCome123#123# WelCome123#123# WelCome123#123# WelCome123#123# WelCome123#123# WelCome123#123# users temp $ORACLE_HOME/demo/schema/log/ PDB
```

```sql
@mksample systempw syspw hrpw oepw pmpw ixpw shpw bipw users temp /your/path/to/log/ connect_string
```


# 参考
https://docs.oracle.com/cd/F19136_01/comsc/lot.html