17.00 - 17.05 - JSON型の値の取得例 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

この例では、FNC_GetInternalValueを使用して、JSONインスタンスの文字列表現を取得し、特定の名前と値ペアで検索します。

SQL定義:

REPLACE FUNCTION getJSONValue (a1 JSON(100))
RETURNS VARCHAR(100)
NO SQL
PARAMETER STYLE TD_GENERAL
DETERMINISTIC
LANGUAGE C
EXTERNAL NAME 'CS!getJSONValue!getJSONValue.c!F!getJSONValue';

C関数定義、getJSONValue.c:

#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
#include <stdio.h>
#define buffer_size 64000

void getJSONValue (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)
   {
      jsonBuf = (char*)FNC_malloc(maxLength);
      FNC_GetInternalValue((*json_instance),
                           (void*)jsonBuf,
                           maxLength,
                           &actualLength);

      searchString1 = strstr(jsonBuf, "name");
      searchString2 = strchr(searchString1, ':');
      searchString1 = strchr(searchString2, '}');
      strLength = searchString1 - searchString2;
      strncpy(result,(searchString2+sizeof(char)), strLength-sizeof(char));

      FNC_free(jsonBuf);
   }
}

問合わせの例:

SELECT getJSONValue(NEW JSON('{"name":"Cameron"}'));

結果:

getJSONValue( NEW JSON('{"name":"Cameron"}', LATIN))
----------------------------------------------------
"Cameron"