【Oracle 26ai】次世代標準「CO (Customer Orders)」サンプル・スキーマ導入完全ガイド

26ai

こんにちは!オラクルエンジニアの皆さん、26aiライフ楽しんでますか?

Oracle Database 26ai (23ai) 時代に突入し、SQLの書き方やアプリケーションの設計思想も大きく変わってきました。「とりあえず SELECT * FROM EMP」という手癖、そろそろアップデートしませんか?

現代のOracle(JSON、マイクロサービス、AI Vector Search)を使い倒すための新しい遊び場、それが CO (Customer Orders) スキーマ です。

今回は、Oracle AI Database 26ai Free環境に、このCOスキーマをインストールする手順を、実際のログを交えて解説します。以前のように「DBCAでチェック入れて終わり」ではないので、ぜひ参考にしてください。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

なぜ今、COスキーマなのか?

これまでの HR (Human Resources) スキーマは、リレーショナルデータ(結合や集計)の学習には最適でした。しかし、現代のアプリ開発で求められる以下の要素が含まれていません。

  • JSONドキュメント
  • eコマース的なデータモデル(店舗、在庫、注文)
  • ベクトル検索用のテキストデータ

これらをすべて網羅し、特に JSON Relational Duality Views を試すために設計されたのが CO スキーマです。26aiを触るなら、これがないと始まりません。

インストール実践ログ

それでは、実際に私の検証環境(Oracle AI Database 26ai Free Release 23.26.0.0.0)に入れた際の手順をステップバイステップで見ていきましょう。

0. 前提条件と準備

サンプルスキーマはDBメディアには同梱されなくなりました。まずは以下の手順で入手し、サーバー上に展開します。

  1. GitHubの 公式リポジトリ (Releases) にアクセスします。
  2. 最新バージョンの Source code (zip) をクリックしてダウンロードします(ファイル名例: db-sample-schemas-23.3.zip)。
  3. ダウンロードしたファイルをサーバー上の作業ディレクトリ(例: /home/oracle/)に配置します。
  4. 以下のコマンドで解凍(unzip)します。
cd /home/oracle/
unzip db-sample-schemas-23.3.zip

解凍すると db-sample-schemas-23.3 というフォルダが作成されます。今回はその中の customer_orders フォルダを使用します。

1. データベースへの接続とPDB切替

解凍ができたら、まずは管理者権限でログインします。ここで最大の注意点は 「コンテナ(PDB)に切り替えること」 です。サンプルスキーマは CDB$ROOT ではなく、プラガブル・データベース(PDB)に入れるのが鉄則です。

まず、解凍したディレクトリへ移動してからSQL*Plusを起動しましょう。

[oracle@26ai-single ~]$ cd /home/oracle/db-sample-schemas-23.3/customer_orders
[oracle@26ai-single customer_orders]$ sqlplus / as sysdba

SQL*Plus: Release 23.26.0.0.0 - Production on Sat Jan 3 02:16:34 2026
Version 23.26.0.0.0

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

Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

PDBを確認してスイッチします。Free版なので FREEPDB1 がターゲットですね。

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 FREEPDB1                       READ WRITE NO

SQL> alter session set container=freepdb1;
Session altered.

SQL> show con_name
CON_NAME
------------------------------
FREEPDB1

2. インストールスクリプトの実行

対象のディレクトリ(co_install.sql がある場所)からSQL*Plusを起動していれば、そのまま実行コマンドを叩くだけです。

SQL> @co_install.sql

スクリプトが走り出すと、対話形式でいくつか質問されます。

  1. パスワード: COユーザーのパスワードを決めます。
  2. 表領域: デフォルトで良ければEnter(通常はUSERSに入ります)。
  3. 上書き確認: 既にCOスキーマがある場合、作り直すか聞かれます。

実際のログがこちら。

Thank you for installing the Oracle Customer Orders Sample Schema.
...(中略)...
Enter a password for the user CO: [パスワード入力]

Enter a tablespace for CO [USERS]: [Enter]
Do you want to overwrite the schema, if it already exists? [YES|no]: YES

ここからテーブル作成とデータロードが走ります。

****** Creating CUSTOMERS table ....
Table created.
****** Creating STORES table ....
Table created.
...(中略)...
Table altered.

3. 検証(Verification)

スクリプトの最後に、投入されたデータ件数のチェック結果が表示されます。これが「actual」と「provided」で一致していれば成功です。

Verification:

Table         provided     actual
----------- ---------- ----------
customers          392        392
stores              23         23
products            46         46
orders            1950       1950
shipments         1892       1892
order_items       3914       3914
inventory          566        566

Thank you!
The installation of the sample schema is now finished.

無事完了しました!自動的に切断されます。

インストール後の確認

念のため、作成された CO ユーザーでログインできるか、テーブルが見えているかを確認しておきましょう。

[oracle@26ai-single customer_orders]$ sqlplus co/co@26ai-single:1521/freepdb1

※接続文字列は環境に合わせて変更してください。ここでは簡易接続ネーミングを使用しています。

SQL*Plus: Release 23.26.0.0.0 - Production on Sat Jan 3 02:19:45 2026
...
Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free

SQL> show con_name
CON_NAME
------------------------------
FREEPDB1

SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
CUSTOMERS
STORES
PRODUCTS
ORDERS
SHIPMENTS
ORDER_ITEMS
INVENTORY

7 rows selected.

完璧です。7つのテーブルが作成されました。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

実践編:26aiの目玉機能「JSON Relational Duality View」を試す

インストールして終わりではありません。ここからが26aiの本番です。 COスキーマの最大の特徴は、「正規化されたリレーショナルテーブルを、アプリからは1つのJSONドキュメントとして扱える」 という点です。

そもそも JSON Relational Duality View とは?

通常、アプリ開発者は「注文データ」を扱う際、以下のように悩まされます。

  • RDB(SQL)の世界: ORDERS テーブルと ORDER_ITEMS テーブルを結合(JOIN)してデータを取ってくる必要がある。保存するときも別々に INSERT しないといけない。面倒くさい。
  • NoSQL(JSON)の世界: 1つのJSONファイルにまとめてポンと保存できる。楽だけど、データの整合性(在庫マスタとの一致など)を保つのが大変。

この2つの「いいとこ取り」をしたのが Duality View です。

  • 見た目はJSON: アプリからは1つのドキュメントに見える。
  • 実体はテーブル: 裏側では正規化されたテーブルに自動分解して保存される。

実際に、ORDERS(注文)テーブルを中心に、ORDER_ITEMS(明細)、PRODUCTS(製品)、CUSTOMERS(顧客)を結合した 書き込み可能なJSONビュー を作成してみましょう。

※注: スキーマのバージョンによりカラム名が異なる場合があります(ORDER_DATETIME, ORDER_TSTAMP, ORDER_DATEなど)。エラーになる場合は DESC ORDERS で定義を確認してください。ここでは頂いた情報を元に ORDER_TMS を使用します。

1. Duality Viewの作成

以下のSQLを実行して、JSONビュー ORDERS_DV を作成します。

ポイント解説:

  • SELECT JSON {...}: JSONの構造を定義します。
  • WITH INSERT UPDATE DELETE: このビュー経由で、裏側のテーブルに対してデータの追加・更新・削除を許可するかどうかを指定します。例えば、PRODUCTS(製品マスタ)は注文情報から勝手に書き換えられたくないので、参照のみに制限することも可能です(今回は練習のため許可しています)。
  • 主キーの指定: ビューを作成するには、各テーブルの主キー(_id に相当するもの)を必ず含める必要があります。
CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW ORDERS_DV AS
SELECT JSON {
  '_id'          : o.order_id,
  'orderDate'    : o.order_tms,
  'orderStatus'  : o.order_status,
  'customer'     : (
    SELECT JSON {
      'customerId' : c.customer_id,
      'fullName'   : c.full_name,
      'email'      : c.email_address
    }
    FROM customers c WITH UPDATE
    WHERE c.customer_id = o.customer_id
  ),
  'lineItems'    : [
    SELECT JSON {
      'lineItemId' : i.line_item_id,
      'orderId'    : i.order_id,
      'quantity'   : i.quantity,
      'unitPrice'  : i.unit_price,
      'product'    : (
         SELECT JSON {
           'productId'   : p.product_id,
           'productName' : p.product_name,
           'price'       : p.unit_price
         }
         FROM products p
         WHERE p.product_id = i.product_id
      )
    }
    FROM order_items i WITH INSERT UPDATE DELETE
    WHERE i.order_id = o.order_id
  ]
}
FROM orders o WITH INSERT UPDATE DELETE;
/

2. JSONとしてデータを取得

従来の結合クエリを書かなくても、IDを指定するだけで階層構造を持ったJSONが返ってきます。

実行するSQLの解説:

  • json_serialize(data PRETTY): データベース内部のバイナリJSONデータを、人間が見やすいテキスト形式(改行やインデント付き)に変換して表示します。
  • WHERE v.data."_id" = 1: JSONの中にある _id フィールドの値を見て検索します。_id は特殊文字を含むため、二重引用符 " で囲むのがコツです。
SELECT json_serialize(data PRETTY) 
FROM ORDERS_DV v
WHERE v.data."_id" = 1;

実行結果: 見てください!ORDERS, CUSTOMERS, ORDER_ITEMS, PRODUCTS の4つのテーブルのデータが、たった1回のSELECTで、美しい1つのJSONとして取得できました。

{
  "_id" : 1,
  "_metadata" :
  {
    "etag" : "CAAE1C659045B944A28889B7C49C33FB",
    "asof" : "0000000000201928"
  },
  "orderDate" : "2021-02-04T13:20:22.245677",
  "orderStatus" : "CANCELLED",
  "customer" :
  {
    "customerId" : 3,
    "fullName" : "Gary Jenkins",
    "email" : "gary.jenkins@internalmail"
  },
  "lineItems" :
  [
    {
      "lineItemId" : 1,
      "orderId" : 1,
      "quantity" : 4,
      "unitPrice" : 37,
      "product" :
      {
        "productId" : 33,
        "productName" : "Boy's Pyjamas (Grey)",
        "price" : 23.32
      }
    },
    ...
  ]
}

注目ポイント _metadata: 勝手に _metadata というフィールドが増えていますね。ここにある etag はデータの「バージョン」を表すハッシュ値です。 これを使うことで、「画面に表示してから保存ボタンを押すまでの間に、誰かがデータを書き換えていないか?」を自動的にチェック(楽観的ロック)できるようになります。これが26aiの凄いところです。

3. JSONドキュメントとしてデータを更新

ここが重要です。ビューに対してJSON操作を行うと、Oracleが自動的に「どのテーブルのどの列を更新すべきか」を判断して実行してくれます。

実行するSQLの解説:

  • UPDATE ORDERS_DV: ビューに対して更新をかけます。
  • json_transform(data, SET ...): JSONデータの一部だけをピンポイントで書き換える関数です。
    • '$.lineItems[0].quantity' = 5: 「配列 lineItems の 0番目(最初の要素)にある quantity を 5 に変更しろ」という指示です。
    • アプリ側でJSON全体を書き換えて SET data = '新しいJSON' としても同じことができますが、json_transform ならDB側で部分更新できるため高速です。
-- 注文ID:1 の明細行にある数量(quantity)を 4 → 5 に変更
UPDATE ORDERS_DV v
SET data = json_transform(data, SET '$.lineItems[0].quantity' = 5)
WHERE v.data."_id" = 1;

COMMIT;

実行結果の確認: 裏側のリレーショナルテーブル ORDER_ITEMS を直接覗いてみましょう。

SELECT order_id, quantity FROM order_items WHERE order_id = 1;

  ORDER_ID   QUANTITY
---------- ----------
         1          5
         1          2

成功です!JSONの一部をいじっただけなのに、ちゃんと ORDER_ITEMS テーブルの該当行(quantity)が 5 に更新されています。

よくある質問 (FAQ)

インストールや操作でつまずきやすいポイントをまとめました。

Q: インストール中に ORA-65096: invalid common user or role name というエラーが出ます。 A: CDB$ROOT(コンテナデータベースのルート)に接続している可能性があります。サンプルスキーマはPDB(プラガブル・データベース)に作成する必要があります。alter session set container=freepdb1; などでPDBに切り替えてから実行してください。

Q: co_install.sql を実行すると SP2-0310: unable to open file "co_create.sql" と言われます。 A: スクリプト内の @@ コマンドは、SQL*Plusを実行しているカレントディレクトリのファイルを参照します。SQL*Plusを起動する前に、必ずOSのコマンドで cd を使い、customer_orders フォルダに移動してください。

Q: HRスキーマはもう使わない方がいいですか? A: いいえ、結合や集計などの純粋なSQLの練習には依然として HR が最適です。CO は JSON、マイクロサービス、ドメイン定義などのモダンな機能を検証する用として使い分けるのがおすすめです。

Q: Duality View作成時に ORA-40607 エラーが出ます。 A: ビューの定義に、裏側のテーブルの「主キー(Primary Key)」がすべて含まれているか確認してください。例えば ORDER_ITEMS 表なら order_idline_item_id の両方が必須ですし、ネストした PRODUCTS 表の product_id も選択する必要があります。

Q: GitHubのスクリプトが更新されていて、記事とカラム名が違うのですが? A: サンプルスキーマはGitHubで随時更新されています。特に日付カラム(order_date vs order_tms)などは変更されることがあります。エラーが出た場合は DESC テーブル名 で定義を確認することをお勧めします。

まとめ

これで「モダンなOracle」を試す準備が整いました。 ただのテーブルに見えますが、このCOスキーマこそが、26aiの強力なマルチモデル機能を体験するための最高のサンドボックスです。

ぜひ皆さんの環境でも、インストールして遊び倒してください!

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました