目的
LOB_RESULT_LOCATORによって表現されるWKT (Well-Known Text) CLOBを使用してGeometry型の値を設定します。
構文
void FNC_GeomGetWKTClob(GEO_HANDLE geoHandle, LOB_RESULT_LOCATOR geoClob, int srid)
- GEO_HANDLE geoHandle
- UDF/UDMの戻り値であると定義されているか、または外部ストアド プロシージャに対するINOUT/OUTパラメータであると定義されている、ジオメトリ型へのハンドル。
- LOB_RESULT_LOCATOR geoClob
- Latin文字セットのST_Geometry型の戻り値を含むWKT CLOBのLOBロケータ。
- int srid
- 設定するジオメトリの空間参照系の識別子。
使用上の注意
FNC_GeomSetWKTClob関数は、LOB結果ロケータを使用してST_Geometry戻り/OUT/INOUTパラメータ値を設定します。ST_GeometryハンドルgeoHandleは、入力としてLOB結果ロケータgeoClob.とともに渡されます。geoClobロケータ値はFNC_GeomGetResultWKTClobを呼び出して取得され、LOB FNCルーチンはWKT値をCLOBに追加するために使用されます。この後、FNC_GeomSetWKTClobルーチンに渡されます。CLOBはLatin文字セットである必要があります。
このルーチンが返すCLOBは整形式のWKTデータを含んでいる必要があります。それ以外の場合、FNCルーチンはエラーを返します。
FNC_GeomSetWKTClobは、LOBベースのST_Geometry値とのみ使用する必要があります。その他の場合、次の7579エラーが発生します: FNC_GeomSetWKTClobは、LOBベースのST_Geometry値に対してのみ有効です。代わりにFNC_GeomSetWKT()を使用します。
例: 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);
}
}