例: 最大長または文字セットを指定しているJSON列を含むテーブルの作成
次の例では、最大長と文字セットを指定する方法を示します。
CREATE TABLE json_table(id INTEGER, json_j1 JSON);
結果: これにより、LATIN文字セットおよびその文字セットの最大長が16,776,192のLATIN文字の表が作成されます。JSON型に文字セットが指定されていない場合、ユーザーのデフォルト文字セットが使用されます。この例の結果では、ユーザーのデフォルト文字セットとしてLATINが指定されていることを想定しています。
CREATE TABLE json_table(id INTEGER, json_j1 JSON CHARACTER SET UNICODE);
結果: これにより、UNICODE文字セットおよびその文字セットの最大長が8,388,096のUNICODE文字のテーブルが作成されます。
CREATE TABLE json_table(id INTEGER, json_j1 JSON(100000));
結果: これにより、最大長が100000のLATIN文字のテーブルが作成されます。この例の結果は、ユーザーのデフォルト文字セットがLATINになっていることを想定しています。
CREATE TABLE json_table(id INTEGER, json_j1 JSON(100000) CHARACTER SET UNICODE);
結果: これにより、最大長が100000のUNICODE文字のテーブルが作成されます。
CREATE TABLE json_table(id INTEGER, json_j1 JSON(64000), json_j2 JSON(12000));
結果: この事例は、行に格納される最大データ量が約76000バイトまで増大する可能性があるので失敗します。この事例は、前の項目1で説明したように、最大行サイズを超えます。
CREATE TABLE json_table(id INTEGER, json_j1 JSON(64001), json_j2 JSON(12000));
結果: この事例は、行に格納される最大データ量が16000バイト以内で最大行サイズを超えないので成功します。この事例では、前の項目2で説明したストレージ スキーム(行に最大4Kバイトまで格納される)がjson_j1列に設定されているためです。
例: ストレージ形式を指定しているJSON列を含むテーブルの作成
次のテーブルでは、それぞれの最大長が異なるJSON型の5つの列を定義します。json2の列は、BSONストレージ形式を使用してJSONデータを格納します。json4の列は、UBJSONストレージ形式を使用してJSONデータを格納します。
CREATE TABLE employee ( id INTEGER, json1 JSON(20), json2 JSON(25) STORAGE FORMAT BSON, json3 JSON(30) CHARACTER SET UNICODE, json4 JSON(1000) STORAGE FORMAT UBJSON, json5 JSON(5000));
例: JSON型のパラメータを含む関数の作成
次に、JSON型の入力または戻り値のパラメータを含む関数を示します。
CREATE FUNCTION json1 (p1 JSON(1000)) RETURNS VARCHAR(100) NO SQL PARAMETER STYLE SQL CALLED ON NULL INPUT DETERMINISTIC LANGUAGE C EXTERNAL NAME 'CS!json1!json1.c!F!json1';
void json1 ( JSON_HANDLE *json_handle, VARCHAR_LATIN *result, int *indicator_ary, int *indicator_result, char sqlstate[6], SQL_TEXT extname[129], SQL_TEXT specific_name[129], SQL_TEXT error_message[257]) { /* body function */ }
CREATE FUNCTION json2 (p1 VARCHAR(100)) RETURNS JSON(100) NO SQL PARAMETER STYLE SQL CALLED ON NULL INPUT DETERMINISTIC LANGUAGE C EXTERNAL NAME 'CS!json2!json2.c!F!json2';
void json2 ( VARCHAR_LATIN *result, JSON_HANDLE *json_handle, int *indicator_ary, int *indicator_result, char sqlstate[6], SQL_TEXT extname[129], SQL_TEXT specific_name[129], SQL_TEXT error_message[257]) { /* body function */ }
例: エラー: 定義されたJSON型を格納するには、JSON値が大きすぎる
この例では、JSON列に挿入されるデータが定義されている最大長より大きい場合はエラーが返されます。
この例のsmallJSONTableテーブルには、LATIN文字の最大長が10文字のJSON列があります。
CREATE TABLE smallJSONTable(id INTEGER, j JSON(10));
次のINSERT文は、JSON列に挿入されるデータが10文字未満なので成功します。
INSERT INTO smallJSONTable(1, '{"a":1}');
*** Insert completed. One row added. *** Total elapsed time was 1 second.
次のINSERT文は、'{"a":12345}'が最大長の10文字を超えているので失敗します。
INSERT INTO smallJSONTable(1, '{"a":12345}');
*** Failure 7548 JSON value is too large to store in the defined JSON type.
例: テキストのBSONデータにアクセス中のエラー
この例では、最大長が45バイトでストレージ形式がBSONに定義されているbsonCol列にJSONデータを挿入します。挿入するデータは、BSONで34バイトです。ただし、このデータは、UNICODEテキストでは94バイトです。したがって、問合わせでUNICODEテキストとしてデータにアクセスしようとすると、テキストが45バイトの最大長を超えているため、エラーが返されます。
CREATE TABLE bsonTable(id INTEGER, bsonCol JSON(45) STORAGE FORMAT BSON); /* insert '{"username":null,"password":null,"member":true}' stored as BSON, which is 34 bytes in BSON and 94 bytes in UNICODE text */ INSERT INTO bsonTable(1, NEW JSON('220000000A757365726E616D65000A70617373776F726400086D656D626572000100'xb, BSON)); SELECT bsonCol FROM bsonTable;
結果:
*** Failure 7548 JSON value is too large to store in the defined JSON type.
この場合、AsJSONTextメソッドやAsBSONメソッドを使用して選択した事前定義型(VARCHAR/VARBYTE/CLOB/BLOB)か、または大きいバージョンのUNICODEテキスト形式のJSON型にキャストできます。
例: JSONバイナリ形式列の最大長の超過
この例では、ubjsonTableテーブルに、最大長が50バイトでストレージ形式がUBJSONに定義されているJSON列が含まれます。
CREATE TABLE ubjsonTable(id INTEGER, ubjsonCol JSON(50) STORAGE FORMAT UBJSON);
次のデータは、ubjsonTableに挿入されます。
INSERT ubjsonTable(1,'[100,100,100,100,100,100,100,100,100,100,100,100]');
次の問合わせでは、StorageSizeメソッドを使用して、UNICODEテキストで上記のデータを格納するために必要なバイトのサイズを取得します。
SELECT ubjsonCol.StorageSize('UNICODE_TEXT') FROM ubjsonTable;
結果:
ubjsonCol.STORAGESIZE('UNICODE_TEXT') ------------------------------------- 98
次の問合わせでは、StorageSizeメソッドを使用して、UBJSON形式で上記のデータの格納に現在使用されているサイズをバイト単位で取得します。
SELECT ubjsonCol.StorageSize('UBJSON') FROM ubjsonTable;
結果:
ubjsonCol.STORAGESIZE('UBJSON') ------------------------------- 40
UBJSON形式で挿入したデータは40バイトなので、このデータは最大長が50バイトに定義されているubjsonCol列に収まります。
次の問合わせは、UNICODEテキストとして挿入されたデータを取得しようとしたので失敗しました。挿入するデータは、前述の問合わせで示したように、UNICODEテキストで98バイトです。これは、ubjsonCol列の最大長である50バイトを超えています。
SELECT ubjsonCol FROM ubjsonTable;
結果:
*** Failure 7548 JSON value is too large to store in the defined JSON type.
UNICODEテキスト形式で挿入されたデータを取得するには、次の問合わせに示すように、データを大きいサイズにキャストする必要があります。
SELECT CAST(ubjsonCol as JSON(100) CHARACTER SET UNICODE) FROM ubjsonTable;
結果:
ubjsonCol ------------------------------------------------- [100,100,100,100,100,100,100,100,100,100,100,100]