17.00 - 17.05 - FNC_GeomSetWKBBlob - 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_RESULT_LOCATORによって表現されるWKB (Well-Known Binary) BLOBを使用してGeometry型の値を設定します。

構文

void
FNC_GeomGetWKBBlob(GEO_HANDLE          geoHandle,
                   LOB_RESULT_LOCATOR  geoBlob,
                   int                 srid)
GEO_HANDLE geoHandle
UDF/UDMの戻り値であると定義されているか、または外部ストアド プロシージャに対するINOUT/OUTパラメータであると定義されている、ジオメトリ型へのハンドル。
LOB_RESULT_LOCATOR geoBlob
ST_Geometry型の戻り値を含むWKB BLOBのLOBロケータ。
int srid
設定するジオメトリの空間参照系の識別子。

使用上の注意

FNC_GeomSetWKBBlobは、LOB結果ロケータを使用してST_Geometry戻り/OUT/INOUTパラメータ値を設定します。ST_GeometryハンドルgeoHandleは、入力としてLOB結果ロケータgeoBlobとともに渡されます。geoBlobロケータ値はFNC_GeomGetResultWKBBlobを呼び出して取得され、LOB FNCルーチンはWKTをBLOBに追加するために使用されます。この後、FNC_GeomSetWKBBlobに渡されます。

このルーチンが返すBlobは整形式のWKBデータを含んでいる必要があります。それ以外の場合、FNCルーチンはエラーを返します。

FNC_GeomSetWKBBlobは、LOBベースのST_Geometry値とのみ使用する必要があります。その他の場合、次の7579エラーが発生します: FNC_GeomSetWKBBlob is only valid for LOB-based ST_Geometry values. Use FNC_GeomSetWKB() instead(FNC_GeomSetWKBBlobは、LOBベースのST_Geometry値に対してのみ有効です。代わりにFNC_GeomSetWKB()を使用します)。

例: FNC_GeomGetResultWKBBlobとFNC_GeomSetWKBBlobを使用してST_Geometryの戻り値を取得および設定する

次の関数はST_Geometryパラメータを取り、同じ値を持つST_Geometryを返します。最初にWell-Known Binary形式を入力ジオメトリから取得します。次に、LOB結果ロケータを結果ST_Geometryから取得し、それにWKBを追加してから、戻りST_Geometryの値を設定します。

#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>

void geo_wkb( GEO_HANDLE  *geo_in,
              GEO_HANDLE  *geo_out,
              int         *indicator_geo_in,
              int         *indicator_geo_out,
              char        sqlstate[6],
              SQL_TEXT    extname[129],
              SQL_TEXT    specific_name[129],
              SQL_TEXT    error_message[257])
{
    LOB_RESULT_LOCATOR geoBlob_out;
    LOB_LOCATOR geoBlob_in;
    BYTE buffer[64000];
    LOB_CONTEXT_ID id;
    FNC_LobLength_t actlen;
    int trunc_err = 0;
    FNC_LobLength_t blob_length;
    int srid = -1;
    int max_length, max_length2, numLobs, numLobs2;

    /* If input is null set return value to null. */
    if (*indicator_geo_in == -1 )
    {
        *indicator_geo_out = -1;
        return;
    }


    /* Get the Input Geometry Info */
     FNC_GetGeometryInfo(*geo_in,&max_length, &numLobs);

    /* Get the Output Geometry Info */
     FNC_GetGeometryInfo(*geo_out,&max_length2, &numLobs2);

    /* 
     * Copy geo_in ST_Geometry value to geo_out ST_Geometry value.
     *
     */
    if(numLobs ==1 && numLobs2 ==1)
    {
      /* Get the LOB_RESULT_LOCATOR of geo_out. */
       FNC_GeomGetResultWKBBlob(*geo_out, &geoBlob_out); 

      /* Get the LOB_LOCATOR and srid of the input ST_Geometry value. */
       FNC_GeomGetWKBBlob(*geo_in, &geoBlob_in, &srid); 

      FNC_LobOpen(geoBlob_in, &id, 0, 0);
      blob_length = FNC_GetLobLength(geoBlob_in);
      while (FNC_LobRead(id, buffer, blob_length, &actlen) == 0 
                 && !trunc_err)
        trunc_err = FNC_LobAppend(geoBlob_out, buffer, actlen, &actlen);
      FNC_LobClose(id);

      /* Set the return ST_Geometry value */
       FNC_GeomSetWKBBlob(*geo_out, geoBlob_out, srid); 
    }
}