目的
データを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"