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