目的
LOB_RESULT_LOCATORによって表現されるWKB (Well-Known Binary) BLOBを使用してGeometry型の値を設定します。
構文
void FNC_GeomGetWKBBlob(GEO_HANDLE geoHandle, LOB_RESULT_LOCATOR geoBlob, int srid)
- GEO_HANDLE geoHandle
- UDF/UDMの戻り値であると定義されているか、または外部ストアド プロシージャに対するINOUT/OUTパラメータであると定義されている、ジオメトリ型へのハンドル。
- LOB_RESULT_LOCATOR geoBlob
- ST_Geometry型の戻り値を含むWKB BLOBのLOBロケータ。
- int srid
- 設定するジオメトリの空間参照系の識別子。
使用上の注意
FNC_GeomSetWKBBlobは、LOB結果ロケータを使用してST_Geometry戻り/OUT/INOUTパラメータ値を設定します。ST_GeometryハンドルgeoHandleは、入力としてLOB結果ロケータgeoBlobとともに渡されます。geoBlobロケータ値はFNC_GeomGetResultWKBBlobを呼び出して取得され、LOB FNCルーチンはWKTをBLOBに追加するために使用されます。この後、FNC_GeomSetWKBBlobに渡されます。
このルーチンが返すBlobは整形式のWKBデータを含んでいる必要があります。それ以外の場合、FNCルーチンはエラーを返します。
FNC_GeomSetWKBBlobは、LOBベースのST_Geometry値とのみ使用する必要があります。その他の場合、次の7579エラーが発生します: FNC_GeomSetWKBBlob is only valid for LOB-based ST_Geometry values. Use FNC_GeomSetWKB() instead(FNC_GeomSetWKBBlobは、LOBベースのST_Geometry値に対してのみ有効です。代わりにFNC_GeomSetWKB()を使用します)。
例: FNC_GeomGetResultWKBBlobとFNC_GeomSetWKBBlobを使用してST_Geometryの戻り値を取得および設定する
次の関数はST_Geometryパラメータを取り、同じ値を持つST_Geometryを返します。最初にWell-Known Binary形式を入力ジオメトリから取得します。次に、LOB結果ロケータを結果ST_Geometryから取得し、それにWKBを追加してから、戻りST_Geometryの値を設定します。
#define SQL_TEXT Latin_Text #include <sqltypes_td.h> #include <string.h> void geo_wkb( 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 geoBlob_out; 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, 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_GeomGetResultWKBBlob(*geo_out, &geoBlob_out); /* 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(geoBlob_out, buffer, actlen, &actlen); FNC_LobClose(id); /* Set the return ST_Geometry value */ FNC_GeomSetWKBBlob(*geo_out, geoBlob_out, srid); } }