目的
ジオメトリの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);
}
}