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

目的

ジオメトリのWKB (Well-Known Binary)表現をBLOBとして返します。

構文

void
FNC_GeomGetWKBBlob(GEO_HANDLE  geoHandle,
                   LOB_LOCATOR *geoBlob,
                   int *srid)
GEO_HANDLE geoHandle
外部ルーチンへの入力パラメータとして定義されたST_Geometry型へのハンドル。
LOB_LOCATOR *geoBlob
ST_Geometry型のBLOB表現に対するLOBロケータ。
int* srid
ジオメトリの空間参照系の識別子。

使用上の注意

FNC_GeomGetWKBBlobは、ST_Geometry型のWell-Known Binary BLOB表現のLOBロケータを取得します。ST_GeometryハンドルgeoHandleは、入力として渡されます。LOBロケータ値geoBlobは、関数から返されます。次にユーザーはLOB FNCルーチンを使用してgeoBlobロケータから読み取ることができます。

FNC_GeomGetWKBBlob関数はLOBベースのST_Geometry値とのみ使用できます。インラインST_Geometry値と使用されると、次の7579エラーが発生します: FNC_GeomGetWKBBlobは、LOBベースのST_Geometry値に対してのみ有効です。代わりにFNC_GeomGetWKB()を使用します。

例: FNC_GeomGetWKBBlobを使用してST_Geometry WKBを取得する

次の関数例では、ST_Geometryパラメータを受け取り、ジオメトリのWell-Known Binary形式を取得します。これはBLOBとして取得されたWKBを返します。

REPLACE FUNCTION getwkb_udf(p1 ST_Geometry)
RETURNS BLOB AS LOCATOR
SPECIFIC getwkb_udf
NO SQL
PARAMETER STYLE SQL
DETERMINISTIC
LANGUAGE C
EXTERNAL NAME 'CS!getwkb_udf!getwkb.c!F!getwkb_udf';

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

void getwkb_udf(GEO_HANDLE  *geo_in, 
                LOB_RESULT_LOCATOR *outBlob,
                int         *indicator_geo_in,
                int         *indicator_outBlob,
                char        sqlstate[6],
                SQL_TEXT    extname[129],
                SQL_TEXT    specific_name[129],
                SQL_TEXT    error_message[257])
{
    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, numLobs;

    /* If input is null set return value to null. */
    if (*indicator_geo_in == -1 )
    {
        *indicator_outBlob = -1;
        return;
    }
    /* Get the Geometry Info */
     FNC_GetGeometryInfo(*geo_in,&max_length, &numLobs);

    /* 
     * Copy geo_in ST_Geometry value to outClob value.
     *
     */
    if(numLobs == 1)
    {

    /* 
     * Copy geo_in ST_Geometry value to outBlob value.
     *
     */

      /* 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(*outBlob, buffer, actlen, &actlen);
     FNC_LobClose(id);
    }
}