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

目的

ジオメトリのWKT (Well-Known Text)表現をLatin文字セットのCLOBとして返します。

構文規則

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

使用上の注意

FNC_GeomGetWKTClobは、ST_Geometry型のCLOB表現に対しLOBロケータを取得するために使用されます。ST_GeometryハンドルgeoHandleは、入力として渡されます。LOBロケータ値geoClobは、関数から返されます。この後、LOB FNCルーチンを使用して、ロケータから読み込むことができます。

FNC_GetGeomeryInfo関数は、ST_GeometryインスタンスがLOBベースの値であるかどうかを決定するために使用できます。インスタンスがLOBではない場合 (例: numLobs = 0)、LOB以外のFNC_GeomGetWKT関数を使用します。

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

例: FNC_GeomGetWKTClobを使用してST_Geometry WKTを取得する

次の関数では、ST_Geometryパラメータを受け取り、ジオメトリのWell-Known Text形式を取得します。これは文字列をCLOBとして返します。

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

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

void getwkt_udf(GEO_HANDLE  *geo_in, 
                LOB_RESULT_LOCATOR *outClob,
                int         *indicator_geo_in,
                int         *indicator_outClob,
                char        sqlstate[6],
                SQL_TEXT    extname[129],
                SQL_TEXT    specific_name[129],
                SQL_TEXT    error_message[257])
{
    LOB_LOCATOR geoClob_in;
    BYTE buffer[64000];
    LOB_CONTEXT_ID id;
    FNC_LobLength_t actlen;
    int trunc_err = 0;
    FNC_LobLength_t clob_length;
    int srid = -1;
    int max_length;
    int numLobs;

    /* If input is null set return value to null. */
    if (*indicator_geo_in == -1 )
    {
        *indicator_outClob = -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)
    {
        /* Get the LOB_LOCATOR and srid of the input ST_Geometry value. */ 
 FNC_GeomGetWKTClob(*geo_in, &geoClob_in, &srid); 

       FNC_LobOpen(geoClob_in, &id, 0, 0);
       clob_length = FNC_GetLobLength(geoClob_in);
       while (FNC_LobRead(id, buffer, clob_length, &actlen) == 0 
                                                          && !trunc_err)
           trunc_err = FNC_LobAppend(*outClob, buffer, actlen, &actlen);
       FNC_LobClose(id);
    }
}