JSONインスタンスの最大長の例 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - JSONデータ型

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年9月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/gzn1554761068186.ditamap
dita:ditavalPath
ja-JP/gzn1554761068186.ditaval
dita:id
evi1472243742653
Product Category
Software
Teradata Vantage

例: 最大長または文字セットを指定しているJSON列を含むテーブルの作成

次の例では、最大長と文字セットを指定する方法を示します。

例: JSON型の単一の列を使用し、最大長と文字セットを指定せずにテーブルを作成する
CREATE TABLE json_table(id INTEGER, json_j1 JSON);

結果: これにより、LATIN文字セットおよびその文字セットの最大長が16,776,192のLATIN文字の表が作成されます。JSON型に文字セットが指定されていない場合、ユーザーのデフォルト文字セットが使用されます。この例の結果では、ユーザーのデフォルト文字セットとしてLATINが指定されていることを想定しています。

例: JSON型の単一の列を使用し、最大長を指定せずにUNICODE文字セットを指定してテーブルを作成する
CREATE TABLE json_table(id INTEGER, json_j1 JSON CHARACTER SET UNICODE);

結果: これにより、UNICODE文字セットおよびその文字セットの最大長が8,388,096のUNICODE文字のテーブルが作成されます。

例: JSON型の単一の列を使用し、最大長を指定し、文字セットを指定せずにテーブルを作成する
CREATE TABLE json_table(id INTEGER, json_j1 JSON(100000));

結果: これにより、最大長が100000のLATIN文字のテーブルが作成されます。この例の結果は、ユーザーのデフォルト文字セットがLATINになっていることを想定しています。

例: JSON型の単一の列を使用し、最大長を指定し、UNICODE文字セットを指定してテーブルを作成する
CREATE TABLE json_table(id INTEGER, json_j1 JSON(100000) CHARACTER SET UNICODE);

結果: これにより、最大長が100000のUNICODE文字のテーブルが作成されます。

例: JSON型の複数の列を使用し、許容される長さを超える最大長を指定し、文字セットを指定せずにテーブルを作成する
CREATE TABLE json_table(id INTEGER, json_j1 JSON(64000), json_j2 JSON(12000));

結果: この事例は、行に格納される最大データ量が約76000バイトまで増大する可能性があるので失敗します。この事例は、前の項目1で説明したように、最大行サイズを超えます。

例: JSON型の複数の列を使用し、最大長を指定し、文字セットを指定せずにテーブルを作成する
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]