拡張スカラー値を表すテキストJSONオブジェクト
ネイティブ・バイナリJSONデータ(OSON形式)は、SQL型に対応し、JSON標準の一部ではないスカラー型(日付など)を追加することで、JSON言語を拡張します。 Oracle Databaseでは、「表現」 JSONスカラー値(このような非標準値を含む)を含むテキストJSON objectsの使用もサポートされています。
このような拡張オブジェクトが含まれるテキストのJSONデータからネイティブ・バイナリJSONデータを作成する場合、必要に応じて、対応する(ネイティブ・バイナリ)JSONスカラー値に置き換えることができます。
拡張オブジェクトの例として、{"$numberDecimal":31}
があります。 これは、非標準型「小数」のJSONスカラー値を表し、そのように解釈されると、ネイティブ・バイナリ形式の小数に置き換えられます。
たとえば、JSONデータ型コンストラクタJSON
を使用する場合、キーワードEXTENDED
を使用すると、テキストの入力で認識された拡張オブジェクトがネイティブ・バイナリJSONの結果では対応するスカラー値に置き換えられます。 キーワードEXTENDED
を含めなければ、このような置換は発生しません。テキストの拡張JSONオブジェクトは、ネイティブ・バイナリ形式のJSONオブジェクトにそのまま変換されるだけです。
逆に、SQL/JSONファンクションjson_serialize
を使用してバイナリJSONデータをテキストJSONデータ(VARCHAR2
、CLOB
またはBLOB
)として直列化する場合は、キーワードEXTENDED
を使用して(ネイティブ・バイナリ)JSONスカラー値を対応するテキスト拡張JSONオブジェクトに置換できます。
ノート:
使用するデータベースがOracle Autonomous Databaseの場合、PL/SQLプロシージャDBMS_CLOUD.copy_collection
を使用して、Oracle NoSQL Databaseなどの一般的なNoSQLデータベースによって生成されるようなJSONデータのファイルからJSONドキュメント・コレクションを作成できます。
ejson
をプロシージャのtype
パラメータの値として使用すると、入力ファイルで認識された拡張JSONオブジェクトが、結果のネイティブ・バイナリJSONコレクションでは対応するスカラー値に置き換えられます。 もう1つの方向では、ファンクションjson_serialize
をキーワードEXTENDED
とともに使用して、結果のテキストのJSONデータで、スカラー値を拡張JSONオブジェクトに置き換えることができます。
拡張オブジェクトの主なユースケースは次の2つです:
-
「交換」 (import/export):
-
拡張オブジェクトを含む既存のJSONデータを(どこかから)収集します。
-
データベースの外部で使用するために、拡張オブジェクトを使用してネイティブ・バイナリJSONデータをテキストJSONデータとして直列化します。
-
-
ネイティブ・バイナリJSONデータの検査: 対応する拡張オブジェクトを調べて、保持しているものを確認します。
交換のために、Oracle NoSQL Databaseなどの共通のNoSQLデータベースによって生成されたファイルからJSONデータを収集し、拡張オブジェクトをネイティブのバイナリJSONスカラーに変換できます。 一方、ネイティブ・バイナリJSONデータをテキスト・データとしてエクスポートし、Oracle固有のスカラーJSON値を対応するテキスト拡張JSONオブジェクトで置き換えることができます。
ヒント:
インスペクションの例として、ネイティブJSONデータをシリアライズした結果として、{"dob" : "2000-01-02T00:00:00"}
などのオブジェクトを考えてみます。 "2000-01-02T00:00:00"
は日付型のネイティブ・バイナリ値をシリアライズした結果ですか、それともネイティブ・バイナリ値は単なる文字列ですか。 キーワードEXTENDED
を指定してjson_serialize
を使用すると、次のことがわかります。
拡張オブジェクト・フィールドのスカラーJSON型へのマッピングは、一般に多対1です: 複数の種類の拡張JSONオブジェクトを特定のスカラー値にマップできます。 たとえば、拡張JSONオブジェクトの{"$numberDecimal":"31"}
と{"$numberLong:"31"}
は、どちらも値31のJSON言語スカラー型numberとして変換され、これらの各JSONスカラーに対して項目メソッドtype()
は"number"
を返します。
項目メソッドtype()
は、対象値のJSON言語スカラー型を(JSON文字列として)報告します。 スカラー値の中には、同じスカラー型であっても内部的に区別できるものがあります。 これにより、通常、ファンクションjson_serialize
(キーワードはEXTENDED
)は元の拡張JSONオブジェクトを再構築できます。 そのようなスカラー値は、その値を実装する各種のSQL型を使用するか、導出元の拡張JSONオブジェクトの種類でタグ付けすることで、内部的に区別されます。
json_serialize
が元の拡張JSONオブジェクトを再構築する場合、結果は常に元のオブジェクトと同じ「テキスト形式」ではありませんが、常に「意味的」と同等です。 たとえば、{"$numberDecimal":"31"}
と{"$numberDecimal":31}
は、フィールド値の型が異なっていても(文字と数値)、意味的に等しくなります。 これらは同じ内部値に変換され、それぞれが$numberDecimal
拡張オブジェクト(同じタグ)から導出されたものとしてタグ付けされます。 ただし、シリアライズすると、どちらの結果も{"$numberDecimal":31}
になります。 Oracleでは常に、スカラー型数値のフィールド値(この場合はJSON言語値31
)に最も直接的に関連する型が使用されます。
「表3-1」では、使用される様々なタイプ間の対応関係が示されます。 (1)入力として使用される拡張オブジェクトの型、(2)項目メソッドtype()
によって報告される型、(3)内部で使用されるSQL型、(4)ファンクションjson_serialize
による出力として使用される標準のJSON言語型、および(5)キーワードEXTENDED
が指定されている場合のjson_serialize
による拡張オブジェクト出力の型の間でマップします。
表3-1 拡張JSONオブジェクト型リレーション
拡張オブジェクト・タイプ(入力) | Oracle JSONスカラー・タイプ(type()によりレポート) | SQLスカラー型 | 標準JSONスカラー型(出力) | 拡張オブジェクト・タイプ(出力) |
---|---|---|---|---|
値がJSON数値、数値を表す文字列、またはこれらの文字列のいずれかである$numberDouble : "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" 脚注1
|
double | BINARY_DOUBLE |
数値 |
値がJSON数値またはこれらの文字列のいずれかである$numberDouble : "Inf" , "-Inf" , "Nan" 脚注2 |
$numberDouble と同じ値を持つ$numberFloat |
float | BINARY_FLOAT |
数値 |
$numberDouble と同じ値を持つ$numberFloat |
$numberDouble と同じ値を持つ$numberDecimal |
数値 | NUMBER |
数値 |
$numberDouble と同じ値を持つ$numberDecimal |
符号付き32ビット整数または数値を表す文字列の値を持つ$numberInt
|
数値 | NUMBER |
数値 |
$numberDouble と同じ値を持つ$numberInt |
値がJSON数値または数値を表す文字列である$numberLong
|
数値 | NUMBER |
数値 |
$numberDouble と同じ値を持つ$numberLong |
次のいずれかの値を持つ
値がbase-64文字列の場合、拡張オブジェクトには、値が0または4のフィールド |
binary | BLOB またはRAW |
string 変換は、SQL関数 |
次のいずれか1つを使用します。
|
値が24桁の16進数文字列である$oid
|
binary | RAW(12) |
string 変換は、SQL関数 |
値が24桁の16進数文字列である$rawid
|
偶数の16進数文字を含む文字列を持つ$rawhex
|
binary | RAW |
string 変換は、SQL関数 |
値がbase-64文字列で、右側に= 文字が埋め込まれた$binary
|
値が24または32桁の16進数文字列である$rawid
|
binary | RAW |
string 変換は、SQL関数 |
$rawid |
値がISO 8601の日付文字列の$oracleDate
|
date | DATE |
string |
値がISO 8601の日付文字列の$oracleDate
|
値がISO 8601タイムスタンプ文字列の$oracleTimestamp
|
timestamp | TIMESTAMP |
string |
値がISO 8601タイムスタンプ文字列の$oracleTimestamp
|
値がISO 8601タイムスタンプ文字列で、数値タイムゾーン・オフセットまたはZ を含む$oracleTimestampTZ |
タイム・ゾーン付きタイムスタンプ | TIMESTAMP WITH TIME ZONE |
string |
値がISO 8601タイムスタンプ文字列で、数値タイムゾーン・オフセットまたはZ を含む$oracleTimestampTZ |
次のいずれかの値を持つ
|
タイム・ゾーン付きタイムスタンプ | TIMESTAMP WITH TIME ZONE |
string |
値がISO 8601タイムスタンプ文字列で、数値タイムゾーン・オフセットまたはZ を含む$oracleTimestampTZ |
SQL関数to_dsinterval に指定されたISO 8601間隔文字列の値を持つ$intervalDaySecond |
daysecondInterval | INTERVAL DAY TO SECOND |
string |
SQL関数to_dsinterval に指定されたISO 8601間隔文字列の値を持つ$intervalDaySecond |
SQL関数to_yminterval に指定されたISO 8601間隔文字列の値を持つ$intervalYearMonth |
yearmonthInterval | INTERVAL YEAR TO MONTH |
string |
SQL関数to_yminterval に指定されたISO 8601間隔文字列の値を持つ$intervalYearMonth |
2つのフィールド:
|
vector | VECTOR |
数値の配列 |
2つのフィールド:
|
脚注1 文字列値は大/小文字を区別せずに解釈されます。 たとえば、"NAN"
"nan"
および"nAn"
は受け入れられ、同等であり、同様に"INF"
、"inFinity"
および"iNf"
も受け入れられます。 無限大("Infinity"
または"Inf"
)および小さい("-Infinity"
または"-Inf"
)の数値は、完全な単語または略語で受け入れられます。
脚注2 出力では、これらの文字列値のみが使用されます - フル・ワードのInfinityまたは大文字と小文字のバリアントはありません。
関連項目: