17.00 - 17.05 - FNC_GetJSONInputLob - 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
日本語 (日本)

目的

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