目的
ジオメトリのWKB (Well-Known Binary)表現をBLOBとして返します。
構文
void FNC_GeomGetWKBBlob(GEO_HANDLE geoHandle, LOB_LOCATOR *geoBlob, int *srid)
- GEO_HANDLE geoHandle
- 外部ルーチンへの入力パラメータとして定義されたST_Geometry型へのハンドル。
- LOB_LOCATOR *geoBlob
- ST_Geometry型のBLOB表現に対するLOBロケータ。
- int* srid
- ジオメトリの空間参照系の識別子。
使用上の注意
FNC_GeomGetWKBBlobは、ST_Geometry型のWell-Known Binary BLOB表現のLOBロケータを取得します。ST_GeometryハンドルgeoHandleは、入力として渡されます。LOBロケータ値geoBlobは、関数から返されます。次にユーザーはLOB FNCルーチンを使用してgeoBlobロケータから読み取ることができます。
FNC_GeomGetWKBBlob関数はLOBベースのST_Geometry値とのみ使用できます。インラインST_Geometry値と使用されると、次の7579エラーが発生します: FNC_GeomGetWKBBlobは、LOBベースのST_Geometry値に対してのみ有効です。代わりにFNC_GeomGetWKB()を使用します。
例: FNC_GeomGetWKBBlobを使用してST_Geometry WKBを取得する
次の関数例では、ST_Geometryパラメータを受け取り、ジオメトリのWell-Known Binary形式を取得します。これはBLOBとして取得されたWKBを返します。
REPLACE FUNCTION getwkb_udf(p1 ST_Geometry) RETURNS BLOB AS LOCATOR SPECIFIC getwkb_udf NO SQL PARAMETER STYLE SQL DETERMINISTIC LANGUAGE C EXTERNAL NAME 'CS!getwkb_udf!getwkb.c!F!getwkb_udf'; #define SQL_TEXT Latin_Text #include <sqltypes_td.h> #include <string.h> void getwkb_udf(GEO_HANDLE *geo_in, LOB_RESULT_LOCATOR *outBlob, int *indicator_geo_in, int *indicator_outBlob, char sqlstate[6], SQL_TEXT extname[129], SQL_TEXT specific_name[129], SQL_TEXT error_message[257]) { LOB_LOCATOR geoBlob_in; BYTE buffer[64000]; LOB_CONTEXT_ID id; FNC_LobLength_t actlen; int trunc_err = 0; FNC_LobLength_t blob_length; int srid = -1; int max_length, numLobs; /* If input is null set return value to null. */ if (*indicator_geo_in == -1 ) { *indicator_outBlob = -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) { /* * Copy geo_in ST_Geometry value to outBlob value. * */ /* Get the LOB_LOCATOR and srid of the input ST_Geometry value. */ FNC_GeomGetWKBBlob(*geo_in, &geoBlob_in, &srid); FNC_LobOpen(geoBlob_in, &id, 0, 0); blob_length = FNC_GetLobLength(geoBlob_in); while (FNC_LobRead(id, buffer, blob_length, &actlen) == 0 && !trunc_err) trunc_err = FNC_LobAppend(*outBlob, buffer, actlen, &actlen); FNC_LobClose(id); } }