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

目的

UDF/UDMの戻り値、または外部ストアド プロシージャのINOUTパラメータまたはOUTパラメータであると定義されているST_GeometryのCLOBにLOBロケータを返します。

構文規則

void
FNC_GeomGetResultWKTClob(GEO_HANDLE            geoHandle,
                         LOB_RESULT_LOCATOR*   geoClob)
GEO_HANDLE geoHandle
UDF/UDMの戻り値であると定義されているか、または外部ストアド プロシージャに対するINOUT/OUTパラメータであると定義されている、ST_Geometry型へのハンドル。
LOB_RESULT_LOCATOR geoClob
ST_Geometry型の戻り値を設定するために使用されるLOBロケータへのポインタ。

使用上の注意

FNC_GeomGetResultWKTClob関数は、ST_Geometry戻り値の設定に使用される結果LOBロケータの取得に使用されます。ST_GeometryハンドルgeoHandleは入力として渡され、LOBロケータgeoClobは関数から返されます。この後、LOB FNCルーチンを使用して、geoClobロケータを使用しCLOB値に追加します。

Latin文字セットを使用してCLOBに値を追加します。CLOBにはWell-Known Text値を書き込む必要があります。

FNC_GeomGetResultWKTClob関数はLOBベースのST_Geometry値に対してのみ呼び出す必要があります。インラインST_Geometry値を使用すると、次の7579エラーが発生します: FNC_GeomGetResultWKTClobは、LOBベースのST_Geometry型でのみ呼び出すことができます。

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

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

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

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

void geo_wkt( 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 geoClob_out;
    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, 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_GeomGetResultWKTClob(*geo_out, &geoClob_out); 

     /* 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(geoClob_out, buffer, actlen, &actlen);

     FNC_LobClose(id);

     /* Set the return ST_Geometry value */
      FNC_GeomSetWKTClob(*geo_out, geoClob_out, srid);  
    }
}