拡張スカラー値を表すテキストJSONオブジェクト
このページのスクリプト・コンテンツはナビゲーションのみを目的としており、いかなる方法においても内容を変更するものではありません。
ネイティブ・バイナリJSONデータ(OSON形式)は、SQL型に対応していてJSON標準に含まれないスカラー型(日付など)を追加することで、JSON言語を拡張します。Oracle AI Databaseでは、このような非標準の値を含むJSONスカラー値を表すテキストJSONオブジェクトの使用もサポートしています。
When you create native binary JSON data from textual JSON data that contains such extended objects , they can optionally be replaced with corresponding (native binary) JSON scalar values.
拡張オブジェクトの例として、{"$numberDecimal":31}があります。これは、非標準型の小数のJSONスカラー値を表し、そのように解釈されると、ネイティブ・バイナリ形式の10進数に置き換えられます。
たとえば、JSONデータ型コンストラクタJSONを使用する場合、キーワードEXTENDEDを使用すると、テキストの入力で認識された拡張オブジェクトがネイティブ・バイナリJSONの結果では対応するスカラー値に置き換えられます。キーワードEXTENDEDを含めなければ、このような置換は発生しません。テキストの拡張JSONオブジェクトは、ネイティブ・バイナリ形式のJSONオブジェクトにそのまま変換されるだけです。
逆方向では、SQL/JSONファンクションjson_serializeを使用してバイナリJSONデータをテキストのJSONデータ(VARCHAR2、CLOBまたはBLOB)としてシリアライズする場合、キーワードEXTENDEDを使用して、(ネイティブ・バイナリ)JSONスカラー値を対応するテキストの拡張JSONオブジェクトに置き換えることができます。
ノート:使用するデータベースがOracle Autonomous AI Databaseの場合、PL/SQLプロシージャDBMS_CLOUD.copy_collectionを使用して、Oracle NoSQL Databaseなどの一般的なNoWSQLデータベースによって生成されるようなJSONデータのファイルからJSONドキュメント・コレクションを作成することができます。
ejsonをプロシージャのtypeパラメータ値として使用すると、入力ファイルで認識された拡張JSONオブジェクトが、結果のネイティブ・バイナリJSONコレクションでは対応するスカラー値に置き換えられます。もう1つ方向では、ファンクションjson_serializeをキーワードEXTENDEDとともに使用して、結果のテキストのJSONデータで、スカラー値を拡張JSONオブジェクトに置き換えることができます。
拡張オブジェクトの2つの主なユースケースを次に示します。
-
交換(インポート/エクスポート):
-
拡張オブジェクトを含む既存のJSONデータを(どこからでも)取り込みます。
-
データベース外部で使用するために、ネイティブ・バイナリJSONデータを拡張オブジェクトを含むテキストJSONデータとしてシリアライズします。
-
-
ネイティブ・バイナリJSONデータの検査: 対応する拡張オブジェクトを参照して、内容を確認します。
交換のために、Oracle NoSQL Databaseなどの一般的なNoSQLデータベースによって生成されたファイルからJSONデータを取り込み、拡張オブジェクトをネイティブ・バイナリJSONスカラーに変換できます。逆に、ネイティブ・バイナリJSONデータをテキスト・データとしてエクスポートし、Oracle固有のスカラーJSON値を対応するテキスト拡張JSONオブジェクトに置き換えることができます。
ヒント:検査の例としては、{"dob" : "2000-01-02T00:00:00"}などのオブジェクトを、ネイティブJSONデータをシリアライズした結果として考えてみます。"2000-01-02T00:00:00"は、日付型のネイティブ・バイナリ値をシリアライズした結果か、このネイティブ・バイナリ値は単なる文字列ですか。json_serializeをキーワードEXTENDEDとともに使用すると、答えがわかります。
拡張オブジェクト・フィールドからスカラー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}は、フィールド値の型(stringとnumber)が異なっておりても意味的に等しいものです。これらは同じ内部値に変換され、それぞれが$numberDecimal拡張オブジェクト(同じタグ)から導出されたものとしてタグ付けされる。ただし、シリアライズすると、どちらの結果も{"$numberDecimal":31}になります。Oracleでは常に、スカラー型数値のフィールド値(この場合はJSON言語値31)に最も直接的に関連する型が使用されます。
次の表に、使用される様々なタイプの対応を示します。(1)入力として使用される拡張オブジェクトの型、(2)項目メソッドtype()によって報告される型、(3)内部で使用されるSQL型、(4)ファンクションjson_serializeによる出力として使用される標準のJSON言語型、および(5)キーワードEXTENDEDが指定されている場合のjson_serializeによる拡張オブジェクト出力の型の間でマップします。
| 拡張オブジェクト・タイプ(入力) | Oracle JSONスカラー型(type()でレポート) | SQLスカラー・タイプ | 標準JSONスカラー・タイプ(出力) | 拡張オブジェクト・タイプ(出力) |
|---|---|---|---|---|
値がJSON数値、数値を表す文字列または次の文字列のいずれかの$numberDouble: "Infinity"、"-Infinity"、"Inf"、"-Inf"、"Nan"(後述の脚注1を参照) |
double | BINARY_DOUBLE |
番号 | JSON数値の値、または"Inf"、"-Inf"、"Nan"のいずれかの文字列によって$numberDouble(後述の脚注2を参照) |
$numberFloat ($numberDoubleと同じ値を持つ) |
float | BINARY_FLOAT |
番号 | $numberDoubleの場合と同じ値を持つ$numberFloat |
$numberDoubleの場合と同じ値を持つ$numberDecimal |
番号 | NUMBER |
番号 | $numberDoubleの場合と同じ値を持つ$numberDecimal |
符号付き32ビット整数または数値を表す文字列を持つ$numberInt |
番号 | NUMBER |
番号 | $numberInt ($numberDoubleと同じ値を持つ) |
値がJSON数値または数値を表す文字列の$numberLong |
番号 | NUMBER |
番号 | $numberLong ($numberDoubleと同じ値を持つ) |
次のいずれかの値を持つ
値がbase-64文字の文字列の場合、拡張オブジェクトには、1バイトの整数(0-255)または2文字の16進文字列として表される、値0または4のフィールド |
バイナリ | BLOBまたはRAW |
文字列 変換は、SQL関数 |
次のいずれかが指定されます。
|
値が24桁の16進文字列値を持つ$oid |
バイナリ | RAW(12) |
文字列 変換は、SQL関数 |
値が24桁の16進文字列値を持つ$rawid |
値が偶数の16進数文字を含む文字列値を持つ$rawhex |
バイナリ | RAW |
文字列 変換は、SQL関数 |
$binary (値はbase-64文字列、=文字で右詰め) |
値が24または32桁の16進文字列値を持つ$rawid |
バイナリ | RAW |
文字列 変換は、SQL関数 |
$rawid |
値がISO 8601の日付文字列の$oracleDate |
日付 | DATE |
文字列 | 値がISO 8601の日付文字列の$oracleDate |
$oracleTimestamp (値はISO 8601タイムスタンプ文字列) |
時刻 | TIMESTAMP |
文字列 | $oracleTimestamp (値はISO 8601タイムスタンプ文字列) |
$oracleTimestampTZ (値はISO 8601タイムスタンプ文字列で、数値のタイムゾーン・オフセットまたはZを持つ) |
タイムスタンプ(タイムゾーン) | TIMESTAMP WITH TIME ZONE |
文字列 | $oracleTimestampTZ (値はISO 8601タイムスタンプ文字列で、数値のタイムゾーン・オフセットまたはZを持つ) |
次のいずれかの値を持つ
|
タイムスタンプ(タイムゾーン) | TIMESTAMP WITH TIME ZONE |
文字列 | $oracleTimestampTZ (値はISO 8601タイムスタンプ文字列で、数値のタイムゾーン・オフセットまたはZを持つ) |
$intervalDaySecond (値はSQLファンクションto_dsintervalに指定されたISO 8601間隔文字列) |
daysecondInterval | INTERVAL DAY TO SECOND |
文字列 | $intervalDaySecond (値はSQLファンクションto_dsintervalに指定されたISO 8601間隔文字列) |
$intervalYearMonth (値はSQLファンクションto_ymintervalに指定されたISO 8601間隔文字列の値を持つ |
yearmonthInterval | INTERVAL YEAR TO MONTH |
文字列 | 値がSQLファンクションto_ymintervalに指定されたISO 8601間隔文字列の値を持つ$intervalYearMonth |
2つのフィールド:
|
ベクトル | VECTOR |
数の配列 | 2つのフィールド:
|
脚注1文字列値は大/小文字を区別せずに解釈されます。たとえば、"NAN" "nan"、"nAn"は同等で受け入れられ、これは"INF"、"inFinity"および"iNf"も同様にです。無限に大きい("Infinity"または"Inf")および小さい("-Infinity"または"-Inf")数値は、フルワードまたは略称のいずれかで受け入れられます。
脚注2出力では、これらの文字列値のみが使用されます。フルワードInfinityまたは大小文字の変形を使用しません。
ノート
関連項目: 浮動小数点演算のIEEE規格(IEEE 754)