この例では、FNC_GetJSONResultLobを使用して、CLOBからJSONインスタンスを作成します。
SQL定義:
REPLACE FUNCTION getJSONResult (a1 CLOB AS LOCATOR) RETURNS JSON CHARACTER SET LATIN NO SQL PARAMETER STYLE TD_GENERAL DETERMINISTIC LANGUAGE C EXTERNAL NAME 'CS!getJSONResult!getJSONResult.c!F!getJSONResult';
C関数定義、getJSONResult.c:
#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
#include <stdio.h>
#define buffer_size 64000
void getJSONResult (LOB_LOCATOR *inLOB,
JSON_HANDLE *json_instance,
char sqlstate[6])
{
LOB_RESULT_LOCATOR outLOB;
BYTE buffer[buffer_size];
LOB_CONTEXT_ID id;
FNC_LobLength_t readlen, writelen, actualInputLength;
int trunc_err = 0;
int length = 0;
charset_et charset = 0;
int numLobs = 0;
FNC_GetJSONInfo((*json_instance), &length, &charset, &numLobs);
FNC_LobOpen(*inLOB, &id, 0, 0);
actualInputLength = FNC_GetLobLength(*inLOB);
if (actualInputLength > length)
{
sprintf(sqlstate, "U0101\0");
return;
}
FNC_GetJSONResultLob(*json_instance,&outLOB);
readlen=0;
writelen=0;
while( FNC_LobRead(id, buffer, buffer_size, &readlen) == 0 && !trunc_err )
{
trunc_err = FNC_LobAppend(outLOB, buffer, readlen, &writelen);
/* check trunc_err and properly report an error
(performed in the same way as for a standard UDF) */
}
FNC_LobClose(id);
sprintf(sqlstate, "00000\0");
}
テーブル、データ、および問合わせの例:
CREATE TABLE clobTable(id INTEGER, c CLOB);
INSERT INTO clobTable(1, '{"CompanyName":"Teradata"}');
SELECT getJSONResult(c).JSONExtractValue('$.CompanyName')
FROM clobTable;
結果:
getJSONResult(c).JSONEXTRACTVALUE('$.CompanyName')
--------------------------------------------------
Teradata