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