機械翻訳について

拡張スカラー値を表すテキスト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データ(VARCHAR2CLOBまたは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

次のいずれかの値を持つ$binary:

  • base-64文字列
  • フィールドbase64およびsubTypeを持つオブジェクト。その値は、それぞれbase-64文字列および0 (任意のバイナリ)または4 (UUID)の数値です

値がbase-64文字列の場合、拡張オブジェクトには、値が0または4のフィールド$subtypeを1バイト整数(0-255)または2文字の16進数文字列で表すこともできます

binary BLOB またはRAW

string

変換は、SQL関数rawtohexの使用と同等です。

次のいずれか1つを使用します。
  • 値がbase-64文字列である$binary
  • 入力されたsubType値が4 (UUID)の場合、32桁の16進数文字列を持つ$rawid
値が24桁の16進数文字列である$oid binary RAW(12)

string

変換は、SQL関数rawtohexの使用と同等です。

値が24桁の16進数文字列である$rawid
偶数の16進数文字を含む文字列を持つ$rawhex binary RAW

string

変換は、SQL関数rawtohexの使用と同等です。

値がbase-64文字列で、右側に=文字が埋め込まれた$binary
値が24または32桁の16進数文字列である$rawid binary RAW

string

変換は、SQL関数rawtohexの使用と同等です。

$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

次のいずれかの値を持つ$date:

  • 1990年1月1日からのミリ秒の整数値
  • ISO 8601タイムスタンプ文字列
  • 1990年1月1日からのミリ秒の整数値を持つフィールドnumberLongを持つオブジェクト
タイム・ゾーン付きタイムスタンプ 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つのフィールド:

  • 要素が数値または文字列"Nan""Inf"および"-Inf"(非数値および無限値を表す)である配列の値を持つフィールド$vector

  • 文字列値が"float32"または"float64"のフィールド$vectorElementType これらはそれぞれ、IEEE 32ビットおよびIEEE 64ビットの数値に対応しています。

vector VECTOR

数値の配列

2つのフィールド:

  • 要素が数値または文字列"Nan""Inf"および"-Inf"(非数値および無限値を表す)である配列の値を持つフィールド$vector

  • 文字列値が"float32"または"float64"のフィールド$vectorElementType

脚注1 文字列値は大/小文字を区別せずに解釈されます。 たとえば、"NAN" "nan"および"nAn"は受け入れられ、同等であり、同様に"INF""inFinity"および"iNf"も受け入れられます。 無限大("Infinity"または"Inf")および小さい("-Infinity"または"-Inf")の数値は、完全な単語または略語で受け入れられます。

脚注2 出力では、これらの文字列値のみが使用されます - フル・ワードのInfinityまたは大文字と小文字のバリアントはありません。