5.2 二面性ビューからのドキュメント/データの削除

JSONドキュメントを二面性ビューから直接削除することも、二面性ビューの基礎となる表からデータを削除することもできます。例は、これらの可能性を示しています。

ノート:

特に明示的に示されていないかぎり、次のようになります。

  • ここに示す例は、決して相互に依存するものではありません。特に、それらの間には暗黙的な順序付けはありません。

  • ここでの二面性ビューを使用する例では、「二面性ビューの作成」で定義したビューを使用します。これらのビューは、UNNESTを使用して定義されています(例3-1例3-3および例3-5)。

  • ここでの表を使用する例では、「カーレースの例、表」で定義した表を使用します。

1つ以上の二面性ビューのルート(上位)表である表から行を削除すると、それらのビューからその行に対応するドキュメントが削除されます。

例5-6 二面性ビューRACE_DVからのJSONドキュメントの削除 — SQLの使用

この例では、レース二面性ビューrace_dvから_id脚注1202のレース・ドキュメントを削除します。(これは、レース名がSaudi Arabian GPのドキュメントの1つです。)

対応する行は、基礎となる表raceおよびdriver_race_mapから(各表から1行)削除されます。

ただし、race_dv定義表driverにはNODELETEの注釈が付けられているため、driver表から何も削除されません(ルール5の更新を参照。)二面性ビューrace_dvおよびdriver_dvの整形出力ドキュメントは、レース・ドキュメントの削除の影響を示しています。

SELECT json_serialize(DATA PRETTY) FROM race_dv;
SELECT json_serialize(DATA PRETTY) FROM driver_dv;

DELETE FROM race_dv dv WHERE dv.DATA."_id".numberOnly() = 202;

SELECT json_serialize(DATA PRETTY) FROM race_dv;
SELECT json_serialize(DATA PRETTY) FROM driver_dv;

削除の前後の問合せは、このレース・ドキュメントのみ削除されたことを示しています。ドライバ・ドキュメントは削除されませんでした:

{"_id"      : 202,
 "_metadata" : {"etag" : "7E056A845212BFDE19E0C0D0CD549EA0",
                "asof" : "00000000000C20B1"},
 "name"      : "Saudi Arabian Grand Prix",
 "laps"      : 50,
 "date"      : "2022-03-27T00:00:00",
 "podium"    : {},
 "result"    : []}

例5-7 二面性ビューRACE_DVからのJSONドキュメントの削除 — RESTの使用

この例では、Oracle REST Data Services (ORDS)を使用して例5-6と同じことを実行します。二面性ビューの例を所有するデータベース・ユーザー(スキーマ)は、ここではユーザーJANUSとして表示されます。

curl --request GET \
  --url http://localhost:8080/ords/janus/race_dv/
curl --request GET \
  --url http://localhost:8080/ords/janus/driver_dv/

curl --request DELETE \
  --url http://localhost:8080/ords/janus/race_dv/202

DELETEからのレスポンス:

200 OK
{"rowsDeleted" : 1}

二面性ビューrace_dvおよびdriver_dvのそれぞれに対してGETリクエストを使用すると、削除の前後両方に、このレース・ドキュメントのみ削除されたことが示されています。ドライバ・ドキュメントは削除されませんでした:

{"_id"      : 202,
 "_metadata" : {"etag" : "7E056A845212BFDE19E0C0D0CD549EA0",
                "asof" : "00000000000C20B1"},
 "name"      : "Saudi Arabian Grand Prix",
 "laps"      : 50,
 "date"      : "2022-03-27T00:00:00",
 "podium"    : {},
 "result"    : [],
 "links"     : [ {"rel"  : "self",
                  "href" : "http://localhost:8080/ords/janus/race_dv/202"} ]} ],

ノート:

最適なパフォーマンスを得るには、Oracle REST Data Services (ORDS)を構成して、1秒のタイムアウトを指定してメタデータ・キャッシュを有効にしにます:

cache.metadata.enabled = true
cache.metadata.timeout = 1

『Oracle REST Data Servicesインストレーションおよび構成ガイド』の「REST対応SQLサービス設定の構成」を参照してください。

関連項目:

『Oracle REST Data Services開発者ガイド』JSONリレーショナル二面性ビューのサポート



脚注一覧

脚注1: この例では、SQLの単純なドット表記法を使用します。_idがSQL/JSONパス式にありません。そのため、それを二重引用符文字(")で囲む必要があります。これは、それがアンダースコア文字(_)であるためです。