4 JSON列を含む表の作成
JSON列を持つ表を作成できます。SQL条件is json
をチェック制約として使用して、列に挿入されるデータが(整形式の)JSONデータになるようにします。JSONデータを対象とした列を作成する場合は常にis_json
チェック制約を使用することをお薦めします。
例4-1および例4-2にこれを示します。これらの例では、このマニュアル内の別の場所にある例で使用されるデータを保持する表を作成し、データを入力します。
例4-2では、簡潔にするために、2行のデータ(1つのJSON文書)のみが挿入されています。
ノート:
SQL/JSON条件IS JSON
およびIS NOT JSON
は、NULL
以外のSQL値に対してはtrueまたはfalseを戻します。ただし、これらは両方とも、SQLのNULL
に対してはunknown (trueでもfalseでもありません)を戻します。チェック制約で使用される場合、SQL NULL
値の列への挿入が阻止されることはありません。(ただし、SQLのWHERE
句で使用される場合、SQL NULL
は戻されません。)
チェック制約によってデータ挿入のパフォーマンスが低下することは事実です。特定の列に整形式のJSONデータのみが挿入されることが確実である場合、チェック制約を無効にすることを検討できますが、制約は削除しないでください。
関連項目:
-
完全表
j_purchaseorder
の作成の詳細は、外部JSONデータのロードを参照してください。 -
CREATE TABLE
の詳細は、Oracle Database SQL言語リファレンスを参照してください。
例4-1 JSONデータが整形式であることを確認するためのチェック制約でのIS JSONの使用
CREATE TABLE j_purchaseorder
(id VARCHAR2 (32) NOT NULL PRIMARY KEY,
date_loaded TIMESTAMP (6) WITH TIME ZONE,
po_document VARCHAR2 (23767)
CONSTRAINT ensure_json CHECK (po_document IS JSON));
例4-2 VARCHAR2 JSON列へのJSONデータの挿入
INSERT INTO j_purchaseorder
VALUES (
SYS_GUID(),
to_date('30-DEC-2014'),
'{"PONumber" : 1600,
"Reference" : "ABULL-20140421",
"Requestor" : "Alexis Bull",
"User" : "ABULL",
"CostCenter" : "A50",
"ShippingInstructions" :
{"name" : "Alexis Bull",
"Address" : {"street" : "200 Sporting Green",
"city" : "South San Francisco",
"state" : "CA",
"zipCode" : 99236,
"country" : "United States of America"},
"Phone" : [{"type" : "Office", "number" : "909-555-7307"},
{"type" : "Mobile", "number" : "415-555-1234"}]},
"Special Instructions" : null,
"AllowPartialShipment" : true,
"LineItems" :
[{"ItemNumber" : 1,
"Part" : {"Description" : "One Magic Christmas",
"UnitPrice" : 19.95,
"UPCCode" : 13131092899},
"Quantity" : 9.0},
{"ItemNumber" : 2,
"Part" : {"Description" : "Lethal Weapon",
"UnitPrice" : 19.95,
"UPCCode" : 85391628927},
"Quantity" : 5.0}]}');
INSERT INTO j_purchaseorder
VALUES (
SYS_GUID(),
to_date('30-DEC-2014'),
'{"PONumber" : 672,
"Reference" : "SBELL-20141017",
"Requestor" : "Sarah Bell",
"User" : "SBELL",
"CostCenter" : "A50",
"ShippingInstructions" : {"name" : "Sarah Bell",
"Address" : {"street" : "200 Sporting Green",
"city" : "South San Francisco",
"state" : "CA",
"zipCode" : 99236,
"country" : "United States of America"},
"Phone" : "983-555-6509"},
"Special Instructions" : "Courier",
"LineItems" :
[{"ItemNumber" : 1,
"Part" : {"Description" : "Making the Grade",
"UnitPrice" : 20,
"UPCCode" : 27616867759},
"Quantity" : 8.0},
{"ItemNumber" : 2,
"Part" : {"Description" : "Nixon",
"UnitPrice" : 19.95,
"UPCCode" : 717951002396},
"Quantity" : 5},
{"ItemNumber" : 3,
"Part" : {"Description" : "Eric Clapton: Best Of 1981-1999",
"UnitPrice" : 19.95,
"UPCCode" : 75993851120},
"Quantity" : 5.0}]}');
- 列にJSONデータが必然的に含まれるかどうかの確認
表またはビューの特定の列が整形式のJSONデータであることをどうすれば確認できるでしょうか。この場合、この列はDBA_JSON_COLUMNS
、USER_JSON_COLUMNS
およびALL_JSON_COLUMNS
の静的データ・ディクショナリ・ビューにリストされます。
親トピック: JSONデータの格納および管理
4.1 列にJSONデータが必然的に含まれるかどうかの確認
表またはビューの特定の列が整形式のJSONデータであることをどうすれば確認できるでしょうか。この場合、この列はDBA_JSON_COLUMNS
、USER_JSON_COLUMNS
およびALL_JSON_COLUMNS
の静的データ・ディクショナリ・ビューにリストされます。
これらの各ビューには、列名、データ型および形式(TEXT
またはBINARY
)、表名またはビュー名(列TABLE_NAME
)、およびオブジェクトが表かそれともビューか(列OBJECT_TYPE
)がリストされます。
JSONデータに考慮される表の列の場合、is json
チェック制約を含める必要があります。ただし、ビューの場合、次の基準のいずれかを満たせば、列はJSONデータとしてみなされます。
-
基礎となるデータに
is json
チェック制約が含まれる。 -
列が、SQL/JSONファンクション
json_query
の使用の結果である。 -
列が、
json_object
といったJSON生成ファンクションの使用の結果である。 -
列はSQLファンクション
treat
とキーワードAS JSON
の使用で発生したものです。
is json
チェック制約により表の列がJSONデータであることが確認される場合で、かつその制約が後から無効にされた場合、列はビュー内にリストされたままです。チェック制約が削除されている場合、列はビューから削除されます。
ノート:
チェック制約によって論理条件OR
を使用して条件is json
が別の条件と結合される場合、列はこれらのビューにリストされません。この場合、列内のデータがJSONデータであるかどうかは確実ではありません。たとえば、制約jcol is json
OR
length(jcol) < 1000
の場合、列jcol
内のデータがJSONデータであることは確認されません。
関連項目:
ALL_JSON_COLUMNS
および関連データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください
親トピック: JSON列を含む表の作成