目的
データをLOBとして保存したJSONインスタンスのLOB_LOCATORを返します。このLOB_LOCATORをLOB FNCルーチンと共に使用して、JSONインスタンスからデータを読み込むことができます。
構文
void FNC_GetJSONInputLob ( JSON_HANDLE jsonHandle, LOB_LOCATOR *object )
- JSON_HANDLE jsonHandle
- 外部ルーチンへの入力引数として定義されているJSON型インスタンスへのハンドル。
JSON_HANDLEはsqltypes_td.hで次のように定義されます: typedef int JSON_HANDLE;
- LOB_LOCATOR *object
- LOB FNCルーチンと共に使用して、JSONインスタンスのLOBデータを読み込むことができるLOB_LOCATORへのポインタ。
使用上の注意
特定のインスタンスのJSONデータを基本テーブル行またはLOBサブテーブルに保存できます。JSONデータがLOBとして保存される場合のみ、FNC_GetJSONInputLobを使用します。FNC_GetJSONInfoまたはFNC_GetExtendedJSONInfoがnumLobs > 0を返す場合、FNC_GetJSONInputLobを使用することができます。そうでなければ、代わりにFNC_GetInternalValueを使用する必要があります。
FNC_GetJSONInputLobを使用して、文字とバイナリの両方のJSONデータを取得できます。
FNC_GetJSONInputLobの使用例
この例では、FNC_GetJSONInputLobを使用して、JSONインスタンスの文字列表現を取得し、特定の名前と値ペアで検索します。
SQL定義:
REPLACE FUNCTION getJSONInput (a1 JSON(100000)) RETURNS VARCHAR(100) NO SQL PARAMETER STYLE TD_GENERAL DETERMINISTIC LANGUAGE C EXTERNAL NAME 'CS!getJSONInput!getJSONInput.c!F!getJSONInput';
C関数定義、getJSONInput.c:
#define SQL_TEXT Latin_Text #include <sqltypes_td.h> #include <string.h> #include <stdio.h> #define buffer_size 64000 void getJSONInput (JSON_HANDLE *json_instance, VARCHAR_LATIN *result, char sqlstate[6]) { char *jsonBuf; char *searchString1, *searchString2; int maxLength = 0; charset_et charset = 0; int actualLength = 0; int strLength = 0; int numLobs = 0; /* Get the length of the JSON instance. */ FNC_GetJSONInfo((*json_instance),&maxLength,&charset,&numLobs); if (numLobs != 0) { LOB_LOCATOR inLOB; LOB_CONTEXT_ID id; FNC_LobLength_t readlen, actualInputLength; int trunc_err = 0; BYTE *bufPtr = 0; jsonBuf = (char*)FNC_malloc(maxLength); FNC_GetJSONInputLob(*json_instance,&inLOB); readlen=0; actualInputLength = 0; bufPtr = jsonBuf; FNC_LobOpen(inLOB, &id, 0, 0); while( FNC_LobRead(id, bufPtr, buffer_size, &readlen) == 0 && !trunc_err ) { bufPtr += readlen; actualInputLength += readlen; if (actualInputLength >= maxLength) { trunc_err = 1; actualInputLength = maxLength; } /* check trunc_err and properly report an error (performed in the same way as for a standard UDF) */ } FNC_LobClose(id); searchString1 = strstr(jsonBuf, "name"); searchString2 = strchr(searchString1, ':'); searchString1 = strchr(searchString2, '}'); strLength = searchString1 - searchString2; strncpy(result, (searchString2+sizeof(char)), strLength-sizeof(char)); FNC_free(jsonBuf); } }
テーブル、データ、および問合わせの例:
CREATE TABLE jsonTable(id INTEGER, j JSON(100000)); INSERT INTO jsonTable(1, <data large enough to be stored as LOB>); SELECT getJSONInput(j) FROM jsonTable;
結果:
"Cameron"