目的
JSON_SHRED_BATCHとJSON_SHRED_BATCH_UはSQLストアド プロシージャで、任意の数のJSONインスタンスを使用して既存のテーブルに入力し、JSON形式からリレーショナル モデルに柔軟な形でデータをロードすることを可能にします。2つのシュレッド プロシージャがありますが、それらの唯一の相違はデータの文字セットです。機能の説明ではJSON_SHRED_BATCHだけを解説しますが(LATIN文字セットのデータを実行するバージョン)、その解説はJSON_SHRED_BATCH_U(UNICODEバージョン)についても同様に適用できます。
機能の説明
バッチ シュレッディングの手順は、JSON_TABLEへの連続的な複数回の呼び出しにマッピングされ、複合的な一時テーブルを作成します。その値は既存のテーブルに割り当てることができます。構文
- CALL JSON_SHRED_BATCH
- JSON_SHRED_BATCHおよびJSON_SHRED_BATCH_Uプロシージャ呼び出しで使用されるパラメータを次に示します。
- input_query
文字列入力パラメータ。ユーザーによるシュレッディングの実行元となるJSONインスタンスのグループの結果をもたらすクエリーを指定します。追加の列が生じる場合がありshred statementで参照されます。
このパラメータがNULLの場合には、エラーが報告されます。
input queryパラメータは、ソース テーブル内の1つ以上のJSONオブジェクトを操作できます。JSON_SHRED_BATCHを呼び出すユーザーにはソース テーブルに対するSELECT権限が必要です。入力クエリーは、JSON_TABLE関数呼び出しにマップされます。JSON_TABLEでは指定された最初の2つの列がそれぞれID値とJSONオブジェクトになる必要があるので、input queryパラメータでも最初の2つの列がID値とJSONオブジェクトになる必要があります。
以下にinput query文字列の例を示します。
'SELECT id, empPersonalInfo, site FROM test.json_table'
'SELECT JSONDOCID, JSONDT1, a, b FROM jsonshred.JSON_TABLE3 WHERE JSONID=100'
JSONID(大文字または小文字)はキーワードです。JSON文書のID値に使用される一時列名です。JSONIDはinput query句とtable expression句で使用可能です。JSONIDは"colexpr"または"queryexpr"ではtemp_column_nameとして使用できません。
複数のJSONオブジェクトでのJSON_TABLEの実行には、1回の呼び出しの結果とソース テーブル間の結合が必要です。 テーブルの完全な結合を避けるには、結合条件がID列から作成できるように、そのID列をinput queryパラメータに指定する必要があります。
queryexpr内のデータ型(詳しくは後述)は、input queryで指定された列の実際のデータ型と一致する必要があります。明示的なキャストは追加されないので、絶対的なデータ型でない場合は、query exprで定義されたデータ型に対してデータは暗黙的にキャスト可能である必要があります。エラーが発生するとシュレッド失敗となり、ユーザーに報告されます。
JSON_TABLEの実行中に問題が発生した場合は、エラー メッセージでID列を使用して、問題が生じた行を特定します。
- shred statement
断片化された文の構成要素は、input queryから得られるJSONインスタンスを、データがユーザー テーブルに読み込まれる場所にマッピングすることを定義します。
断片化された文がNULLの場合、エラーが報告されます。
断片化された文のキーワードはすべて小文字で指定する必要があります。
以下のセクションでは、断片化された文の構造と構文について解説します。複数の断片化された文を実行できますが、パフォーマンスへの影響があります。
- row expression
- 次に、行式で使用される変数について説明します。
- "rowexpr" :
必須のリテラル入力。
小文字でなければなりません。
- JSONPath expr – JSONインスタンスの特定の部分についての情報を抽出するJSONPath構文の式。例えば、$.schools [*]はすべての学校を識別します。
- "rowexpr" :
- column expression
- 次に、列式の変数について説明します。
- "colexpr" :
必須のリテラル入力。
小文字でなければなりません。
- temp_column_name一時列の任意のユーザー定義による名前。一時列名は固有である必要があり、固有でないとエラーが報告されます。名前は大文字と小文字が区別されません。 例えば、col1とCOL1は、内部問合わせで使用され、固有ではないので失敗します。
ここでは、JSONIDとROWINDEX(大文字または小文字)は使用できません。
- JSONPath expr – JSONオブジェクトの特定の部分についての情報を要求するJSONPath構文のJSONPath式。例えば、$.name。
- "type"
必須のリテラル入力。
小文字でなければなりません。
- data_type – 非LOBのTeradata事前定義型、INTEGERまたはVARCHARなど。サポートされる型のリストについては、サポートされるデータ型を参照してください。
- "fromRoot" : true
オプション。 非相対パスにfromRoot属性を使用する必要があります。 それぞれのcolumn expressionは、相対的でないという指定がない限り、row expression("rowexpr":"JSONPATH式")に対して相対的であると想定します。 相対式は、行式の子のいずれかの名前で始まるのに対して、非相対式はJSONPathでのroot、$で始まります。
trueはリテラルで必ず小文字で表記します。誤ったエラーの発生によりfromRootを設定しようとしました。
ユーザーには、column expressionの構成要素を許容されるデータ型にマッピングする責任があります。明示的なキャストは必要なく、データは目的のデータ型に暗黙的にキャストされます。ただしデータが目的のデータ型に正しくキャストされないとエラーが報告されるので、column expressionの構成要素とデータ型を確認するときは注意が必要です。式の結果が(単一の値でなく)配列またはオブジェクトの場合は、最適な長さのCHARまたはVARCHARが唯一の許容されるデータ型になります。
JSON_TABLEの出力テーブルに含まれる一時列のデータ型を指定する必要があります。これは、column expressionのJSON_SHRED_BATCHとJSON_SHRED_BATCH _Uによって強制的に指定されます。ユーザーは、データが正しく解釈されターゲット テーブルで使用されるように、この情報を提供する必要があります。
- "colexpr" :
- query expression
- クエリー式の変数を次に示します。
- "queryexpr" :
必須のリテラル入力。
小文字でなければなりません。
- temp_column_name一時列の任意のユーザー定義による名前。一時列名は固有である必要があり、固有でないとエラーが報告されます。名前は大文字と小文字が区別されません。 例えば、col1とCOL1は、内部問合わせで使用され、固有ではないので失敗します。
ここでは、JSONIDとROWINDEX(大文字または小文字)は使用できません。
- "column_type" – temp_column_name列のデータ型。
ID値またはJSONオブジェクトではない列に対して、queryexprを使用して、input queryで選択されるデータのデータ型を定義します。queryexprで追加の列を参照し目的のデータ型を指定することが必須になります。
input query内のすべての列は、3番目の列以降、queryexprで同じ順序で複製する必要があります。列の順序は重要ですが、列の名前は重要ではありません。queryexpr内のデータ型は、input queryで指定された列の実際のデータ型と一致する必要があります。明示的なキャストは追加されないので、絶対的なデータ型でない場合は、queryexprで定義されたデータ型に対してデータは暗黙的にキャスト可能である必要があります。エラーが発生するとシュレッド失敗となり、ユーザーに報告されます。
次の例では、順序の重要度を示します。qrycol1とqrycol2の両方の列が、queryexprに含まれることに注意してください。なお、queryexprのqrycol2はinput queryのqrycol1を参照し、queryexprのqrycol1はinput queryのqrycol2を参照します。前述のように、名前ではなく順序が重要です。
CALL SYSLIB.JSON_SHRED_BATCH( 'SELECT JSONDOCID, JSONDT1, qrycol1, qrycol2 FROM jsonshred.JSON_TABLE3 WHERE JSONID=100', '[ { "rowexpr" : "$.population.profile", "colexpr" : [{"col1" : "$.name.first", "type" : "VARCHAR(30)"}, {"col2" : "$.address.zip", "type" : "NUMBER(5,0)"}], "queryexpr" : [{ "qrycol2" : "VARCHAR(20)"}, { "qrycol1" : "VARCHAR(20)"}], "tables" : [ {"jsonshred.JSON_SHRED_TABLE1" : { "metadata" : { "operation" : "insert" }, "columns" : {"EmpID":"JSONID*10", "NAME":"col1","STATE":"qrycol1", "ZIP":"col2"} } } ] } ]',res );
JSONIDとROWINDEX(小文字または大文字)は固定された一時列名なので、colexprとqueryexprで許可されません。それらをこれらの句で使用すると、構文エラーが報告されます。
- "queryexpr" :
- table expression
- テーブル式の変数を次に示します。
- "tables" :
必須のリテラル入力。
小文字でなければなりません。
- "table_name" – 既存のデータベース テーブルの完全修飾名。JSON_SHRED_BATCHを呼び出すユーザーには、このテーブルに対する必須の権限(INSERT、UPDATEなど)が必要です。
JSONIDとROWINDEX (大文字または小文字)はキーワードです。 これらはそれぞれ、入力JSON文書IDの値(input queryの最初の列)と入力行のインデックス番号を追跡するために使用されます。 JSONIDとROWINDEXは、シュレッディング操作のソース値として、table expression句で参照されることがあります。
シュレッディングの処理中、断片化された文それぞれで揮発テーブルが作成されます。テーブルの列は最大2048列まで可能ですが、すべてのテーブル マッピングの列を全部合わせたときに、2044列を超えないようにしてください(4つの内部列があります)。1個からN個のターゲット テーブルを持つことができ、各テーブルには1個からN個の列を指定できますが、すべての列の合計は2044列を超えることはできません。 - "tables" :
- metadata
- 以下にメタデータ変数について説明します。
- "metadata" :
必須のリテラル入力。
小文字でなければなりません。
- "operation" – 必須のリテラル入力。
- "insert" | "update" | "merge" | "delete"
実行する操作。
MERGE操作では、ターゲット テーブルにプライマリ インデックスが作成されていて、プライマリ インデックスはメタデータのキーのメンバーになっている必要があります。
- "keys":
キーの使用はオプションです。使用する場合、"keys":は必須のリテラル項目です。
keys句に指定されるすべての名前を列の割り当て句に含める必要があります。キーは、行式と列式で作成された一時テーブルとターゲット テーブルとの間の結合を実行するために使用されます。パフォーマンスに大きな影響が及ぶため、この処理は慎重に行なってください。MERGE操作では、ターゲット テーブルにプライマリ インデックスが作成されていて、プライマリ インデックスは指定されたキーのメンバーである必要があります。
- "table_column_name" – table_nameによって参照されるテーブル内の列の名前。JSON_SHRED_BATCHを呼び出すユーザーには、この既存のテーブルにおける必須の権限(INSERT、UPDATEなど)が必要です。table_nameは、JSON_SHRED_BATCHのテーブル式で指定されます。
- "filter": – フィルタリングはオプションです。使用する場合、"filter":は必須のリテラル項目です。
- filter_expression
列またはクエリー式の要素を参照するSQL文。
フィルタ文の例: "filter" : "empId<5000"
- "metadata" :
- column assignment
- 次に、列の割り当て変数について説明します。
- "columns" : – 必須のリテラル入力。
- "table_column_name'" – table_nameによって参照されるテーブル内の列の名前。JSON_SHRED_BATCHを呼び出すユーザーには、この既存のテーブルにおける必須の権限(INSERT、UPDATEなど)が必要です。table_nameは完全修飾テーブル名でなければなりません。これは、JSON_SHRED_BATCHのテーブル式で指定されます。
- temp_column_name – "colexpr"または"queryexpr"で定義されているtemp_column_name。一時列の名前は一意である必要があり、一意でないとエラーが報告されます。注意: 一時列の名前では文字の大小が区別されないので、col1とCOL1は一意ではなく、エラーの原因になります。
- "temp_expr" –Teradata SQL式。
- numeric_constant – JSONでサポートされる数値。
- ["string_constant"]
JSONでサポートされる文字列値。
ストリング定数の例: "company" : ["Teradata"]
- boolean_constant
trueまたはfalse。
trueおよびfalseはJSONのキーワードで小文字にする必要があります。
- null
JSONはnullです。
nullはJSONキーワードで小文字にする必要があります。
- result code
- シュレッド操作の結果を表わす出力パラメータ。0の値は成功を示します。ゼロ以外のすべての値は特定のエラー状況を示し、該当するエラー メッセージが返されます。