Oracle 23ai 新機能 – JSONリレーショナル二面性ビュー[ORDS によるデータの変更編]

こんにちは。AIです。(Artificial Intelligence ではありません)

最近はブルーベリーにハマっており、先週 2 パック買って消費してしまいました。。食べすぎといわれても致し方なし。。
ちなみにカナダのスーパーでは、たくさんの種類の生のベリーが並んでおり、手軽にみずみずしいベリーを楽しむことができます。
初夏にはブルーベリー狩りもできますので、カナダに訪れた際はぜひ体験してみてください。

さて、前回の 23ai 新機能の記事では JSONリレーショナル二面性ビューの概要や作成方法についてお伝えしましたが、今回は ORDS を使用したデータの取得や更新について検証していきます!

■事前準備

まずは、今回使用する JSONリレーショナル二面性ビューを作成します。
今回の元表は hr.employees 表となります。

SQL> CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW employees_dv AS
  2    SELECT JSON {'_id' IS e.employee_id,
  3                 'first_name'   IS e.first_name,
  4                 'last_name'   IS e.last_name,
  5                 'email'   IS e.email,
  6                 'phone_number' IS e.phone_number
  7                 } FROM employees e WITH INSERT UPDATE DELETE;

View created.

このビューに対して ORDS からアクセスできるよう、ORDS.ENABLE_OBJECT を実行します。

SQL> BEGIN
  2    ORDS_METADATA.ORDS.ENABLE_OBJECT(
  3        p_enabled => TRUE, 
  4        p_schema => 'HR',
  5        p_object => 'EMPLOYEES_DV',
  6        p_object_type => 'VIEW',
  7        p_object_alias => 'employees_dv',
  8        p_auto_rest_auth => FALSE);
  9      COMMIT; 
 10  END;
 11  /

PL/SQL procedure successfully completed.

■ORDS を使用してデータを挿入

それでは早速、ORDS を使用してテーブルのデータを変更してみましょう。
※リクエストは curl コマンドを使用します。

データを変更する際の SQL コマンドと、HTTP リクエストメソッドはそれぞれ下記のように対応しています。

INSERT = POST
UPDATE = PUT
DELETE = DELETE

まずは POST をリクエストしてデータを挿入します。
なお今回の記事で指定する URL については以下のような構造となっています。

プロトコル : http
ホスト名 : localhost:8080
コンテキスト・ルート : /ords
リクエスト・パス : /スキーマ名/オブジェクト名 or /スキーマ名/オブジェクト名/_id

[oracle@localhost ~]$ curl --request POST \
>   --url http://localhost:8080/ords/hr/employees_dv/ \
>   --header 'Content-Type: application/json' \
>   --data '{"first_name" : "Ryunosuke",
>            "last_name" : "Akutagawa",
>            "email"   : "RAKUTAGAWA",
>            "hire_date"   : "2013-06-17T00:00:00",
>            "job_id"   : "ST_MAN"
>            }'
{"_id":208★,"first_name":"Ryunosuke","last_name":"Akutagawa","email":"RAKUTAGAWA","hire_date":"2013-06-17T00:00:00","job_id":"ST_MAN","_metadata":{"etag":"2679E2E75FDE0E35B77BC65314DBC942","asof":"0000000000D0C930"},"links":[{"rel":"self","href":"http://localhost:8080/ords/hr/employees_dv/208"},{"rel":"describedby","href":"http://localhost:8080/ords/hr/metadata-catalog/employees_dv/item"},{"rel":"collection","href":"http://localhost:8080/ords/hr/employees_dv/"}]}

今回は、_id を指定せずにデータを挿入したため自動的に採番されましたが、明示的に指定して挿入することも可能です。

それでは、早速 POST したデータを確認してみましょう!
ORDS から JSON リレーショナル二面性ビューの特定のデータを確認したい場合は _id の値を URL の末尾に入れます。

[oracle@localhost ~]$ curl --location http://localhost:8080/ords/hr/employees_dv/208

{"_id":208,"first_name":"Ryunosuke","last_name":"Akutagawa","email":"RAKUTAGAWA","hire_date":"2013-06-17T00:00:00","job_id":"ST_MAN","_metadata":{"etag":"2679E2E75FDE0E35B77BC65314DBC942","asof":"0000000000E02EA8"},"links":[{"rel":"self","href":"http://localhost:8080/ords/hr/employees_dv/208"},{"rel":"describedby","href":"http://localhost:8080/ords/hr/metadata-catalog/employees_dv/item"},{"rel":"collection","href":"http://localhost:8080/ords/hr/employees_dv/"}]}[oracle@localhost ~]$

更に JSON リレーショナル二面性ビューと実際の表も確認してみます。

SQL> SELECT * FROM employees_dv WHERE DATA LIKE '%208%';

DATA
--------------------------------------------------------------------------------
:

{"_id":208,"_metadata":{"etag":"2679E2E75FDE0E35B77BC65314DBC942","asof":"000000
0000E032FA"},"first_name":"Ryunosuke","last_name":"Akutagawa","email":"RAKUTAGAW
A","hire_date":"2013-06-17T00:00:00","job_id":"ST_MAN"}
SQL> SELECT employee_id,first_name,last_name FROM employees
  2  WHERE employee_id=208;

EMPLOYEE_ID FIRST_NAME           LAST_NAME
----------- -------------------- -------------------------
        208 Ryunosuke            Akutagawa

リレーショナル二面性ビューの元表にもデータが追加されたのがわかりますね!

■ORDS を使用してデータを更新

では続いて、追加したデータの内容を更新してみましょう。
変更するのは、employee_id が 208 のデータの EMAIL 列とします。
現在は employees 表を確認すると、「RAKUTAGAWA」となっていますね。

SQL> SELECT employee_id,email FROM employees
  2  WHERE employee_id=208;

EMPLOYEE_ID EMAIL
----------- -------------------------
        208 RAKUTAGAWA

これを、PUT で「RAKUTAGAWA_02」に変更してみます。
PUT で既存のデータを更新する際は、前回の記事でもお伝えしている通り etag 情報を含めます。

[oracle@localhost ~]$ curl --request PUT \
>   --url http://localhost:8080/ords/hr/employees_dv/208 \
>   --header 'Content-Type: application/json' \
>   --data '{"_id" : "208",
>            "_metadata" : {"etag":"2679E2E75FDE0E35B77BC65314DBC942"},★
>            "first_name" : "Ryunosuke",
>            "last_name" : "Akutagawa",
>            "email"   : "RAKUTAGAWA_02",
>            "hire_date"   : "2013-06-17T00:00:00",
>            "job_id"   : "ST_MAN"
>            }'
{"_id":208,"first_name":"Ryunosuke","last_name":"Akutagawa","email":"RAKUTAGAWA_02","hire_date":"2013-06-17T00:00:00","job_id":"ST_MAN","_metadata":{"etag":"F81E9D06B528EAB2684BFCF974A33BA2","asof":"0000000000E03655"},"links":[{"rel":"self","href":"http://localhost:8080/ords/hr/employees_dv/208"},{"rel":"describedby","href":"http://localhost:8080/ords/hr/metadata-catalog/employees_dv/item"},{"rel":"collection","href":"http://localhost:8080/ords/hr/employees_dv/"}]}[oracle@localhost ~]$

employees 表を確認すると、EMAIL 列の値が変更されていることが確認できました!

SQL> SELECT employee_id,email FROM employees
  2  WHERE employee_id=208;

EMPLOYEE_ID EMAIL
----------- -------------------------
        208 RAKUTAGAWA_02

■ORDS を使用してデータを削除

最後に DELETE をリクエストして、employee_id が 208 のデータを削除します。

[oracle@localhost ~]$ curl --request DELETE \
>   --url http://localhost:8080/ords/hr/employees_dv/208
{"rowsDeleted":1}
SQL> SELECT employee_id,email FROM employees
  2  WHERE employee_id=208;

no rows selected

指定したデータが削除されていることが確認できました。
(コミットとかないのでちょっとドキドキ)

■まとめ

今回の記事はいかがでしたでしょうか。

コーソルカナダでは Oracle Database に対して Zabbix の監視を導入する案件を受けたことがありますが、その際も SELECT したデータを JSON データとして扱う際に苦労しました…
JSONリレーショナル二面性ビューは、JSON データを更新や挿入にも使用できるようになったものなので、方向性としては逆になりますがこちらも助かる人が多くいるでしょう。

それでは次回の更新もお楽しみに!

カナダの冬を味わいたい!in 2025 ~Arrowhead 編~

こんにちは!IIDA です。2月のトロントは冬真っ盛りですが、本稿執筆時点の月末ともなると、外気温が0度前後の日も増えてきました。

この冬のトロントは、氷点下を10度以上も下回る日が度々あるような気候だったので、個人的には「もう春かな?」と錯覚するほど、格段に暖かくなったように感じる今日この頃です。

さて、表題の件です。コーソルカナダの YT さんの運転で、SH さん、AI さんと一緒にカナダの冬を楽しめるスポットへ行ってきました。今回のブログでは、その時の様子を発信できればと思います。

…というわけで、やってきたのは、
Arrowhead Provincial Park(アローヘッド州立公園)

トロント市街地からのアクセスが比較的よく、それでいてカナダの大自然を感じながらアウトドアアクティビティを満喫できるスポットとして定評があります。今回はここでのクロスカントリースキーを目当てにやってきました。

出発前の予報では、積雪量が十分でない様子だったので、行きの車内では「どうなるんでしょうね…」という感じでした。

ですが、実際に現地に着いてみると、「これぞまさに!」というちょうどいいコンディション!足をとられるほどの雪深さはなく、スキー板で踏み込んだ接地面からは雪のクッションの感触も存分に伝わってきます!

顔を上げると、ほどよく葉落ちした並木道が一面に広がっており、木々の合間から差し込んでくる柔らかい陽射しを浴びながらのスキーは最高に気持ちのいい体験でした!

コーソルカナダ随一のアウトドア経験を持つ YT さんに至っては流石の滑りです。”いい画” が撮れることを内心で期待し、スマホを構えて後ろを滑っていましたが、チャンスは訪れず…。

本人にギリギリ聞こえないくらいの声量で「(TY さん)転べ!転べ!」と念じていましたが、最後まで願い叶わず…。そしてこの表情です。ぐぅぅう(謎の圧倒的敗北感)…。

そんなこんなで丸一日かけて遊び倒しましたが、それでも、周回できたコースはこの公園内のほんの一部(下図の赤枠部)に過ぎません。

公園全体の広さが気になってチェックしたところ、オンタリオ州の公式サイトによると、広さにして1,237ヘクタール。これはコーソルが本社を構える東京都千代田区(約1,164 ヘクタール)がすっぽり収まる規模感でした。

トロントのあるオンタリオ州には、なんと300を超える数の州立公園があるらしいのですが、この公園はそのうちのひとつです。すべての州立公園がこの規模感というわけではないですが、あらためて「カナダって土地広いんだなぁ~」って実感しますね。

今回の Arrowhead Provincial Park もその一つですが、日本のメジャーな観光ガイドにもあまり載っていないようなカナダの名所や魅力は沢山あるので、また次回以降のブログで発信していけたらと思います!

それでは、また次回のブログでお会いしましょう!

P.S. 「Arrowhead Provincial Park でカナダの冬を味わってみたい!」という方は、以下のリンク先も参考にしてみてください~!

△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△

Winter adventure at Arrowhead Provincial Park
→ よくある質問(FAQ)はこちらをチェック!
予約は必要?開園時間は?駐車場はある?料金は?何がレンタルできる? などの事前に知りたい情報が載っています

Ontario Parks Snow Report Arrowhead
→ 現地の積雪状況はこちらをチェック!

△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△

スキー板とストック、ブーツの3点セットは現地でレンタルができたので、当日はほぼ手ぶらで気軽に参加できました。頭から足先までの防寒対策はもちろんですが、サングラス(あるいはゴーグル)も雪目対策として必須ですので、お忘れなく!

カナダの年末年始 in トロント

こんにちは!2024年11月からコーソルカナダの一員になりました、飯田(以後、IIDA)です。

私自身、長期の海外生活は人生初の体験であり、カナダに来たのも今回が初めてとなりますので、よりフレッシュな視点でのブログ発信を今後継続していけたらと思います!

…というわけで今回は、表題の件、カナダ・トロントでのクリスマスシーズンの模様をお届けします~。

やってきたのは、Distillery District(ディストラリーディストリクト/蒸留所地区)

トロントの観光名所を調べると必ずと言っていいほど検索ヒットするような定番スポットであり、クリスマスシーズンともなると、入場口前に長蛇の列ができるほどの盛況ぶりでした。

見どころはやはり、その地区一帯に広がるレンガ造りの景観でしょうか。

日本でいう江戸時代にあたる1837年にルーツを持つとされ、通りを歩きまわるだけでも非日常感をぞんぶんに満喫できました。

ちなみに、クリスマスより前のタイミングでも2~3回ほど足を運んでみましたが、早々にチケットが売り切れてしまって中に入れず…。

ようやく入れたこの日は、クリスマス翌日の12月26日でした。

個人的に面白いなと感じたのは、日本とカナダでクリスマスや年末年始の捉え方に違いがあることでした。

日本の場合、クリスマス商戦という言葉もある位にあちらこちらで盛り上がりを見せ、クリスマス当日ともなると人気のスポットはどこも人で溢れかえるイメージがあるかと思います。

対してカナダの場合、スーパーやドラッグストアはもちろんのこと、クリスマスマーケットでさえも12月25日は終日お休みというのがむしろ普通のようです。

消費者目線では多少の不便さを感じる場面もありましたが、働き手の目線で考えると、特別な日を家族や友人と揃って過ごせる社会のあり方は、カナダで暮らす魅力のひとつかもしれません。

その代わりに(?)、年末から正月三が日にかけてゆっくり過ごす日本の風習はカナダには無いようで、“Happy New Year!!” と盛り上がった翌日の1月2日から通常運行に戻るとのことです。

皆さんは、日本とカナダ、どちらの過ごし方が魅力的に映りますでしょうか?

以上、カナダ・トロントでの年末年始の模様をお届けしました。それでは、また次回のブログでお会いしましょう!