Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
Прошу помощи! Две недели чтения интернета и апробирования разных способов результата не дали. Также поиск по sql.ru не увенчался успехом.

Исходные данные.

Есть БД, в которой размещаются пространственные данные в формате ArcGIS (St_Geometry).
Соответственно, к СУБД прикручена библиотека st_shapelib.dll.

Есть внешнее приложение (на C++), не использующее API ArcSDE, но читающее и пишущее пространственные данные. Для этого используется формат WKB. Доступ к Oracle осуществляется с помощью OCI.

Для чтения/записи двоичных данных (BLOB) в формате WKB, соответственно, используется OCILobLocator.

Примеры запросов:

чтение
SELECT "OBJECTID", SDE.ST_AsBinary("SHAPE") as "SHAPE" FROM "SDE"."MYTABLE"


запись
UPDATE "SDE"."MYTABLE" SET "SHAPE" = SDE.ST_GeomFromWKB(:GEOM, 3405) WHERE "OBJECTID" = 1



Суть проблемы.

При чтении проблем нет.
При попытке вставки/изменения записи получаю следующую ошибку:
ORA
ORA-03001: unimplemented feature
ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 237
ORA-06512: at "SDE.ST_GEOMETRY_OPERATORS", line 162


При этом вызов со стороны приложения корректен, так как если то же самое делать с таблицей, где поле пространственных данных не SDE.ST_Geometry, а штатное от Oracle Spatial - SDO_GEOMETRY, то запись проходит успешно (само собой, в этом случае через "SHAPE" = MDSYS.SDO_GEOMETRY("SHAPE_BLOB", 3405)).
Значит, BLOB передается корректно.

Что любопытно, выполнение в отношении ArcSDE того же кода и с теми же данными, что вызывает OCI-приложение, но из SQL Developer-а, отрабатывает замечательно!

-- Это работает!
DECLARE 
  :GEOM BLOB; 
BEGIN
  :GEOM := HEXTORAW('010200000004000000b6f3fdd497961341c74b37097b2042418941606596961341819543bb822042416f1283c05f971341ac1c5a149d20424175931884829613410ad7a350b6204241');  

  UPDATE "SDE"."MYTABLE" SET "SHAPE" = SDE.ST_GeomFromWKB(:GEOM, 3405) WHERE "OBJECTID" = 1;
END;
SELECT SDE.St_AsText(SHAPE) AS SHAPE FROM "SDE"."MYTABLE" WHERE "OBJECTID" = 1

Значит, библиотека st_shapelib.dll прикручена корректно.


Откуда тогда "ORA-03001: unimplemented feature" при вызове через OCI именно SDE.ST_GeomFromWKB?

Что-то понять по
ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 237
ORA-06512: at "SDE.ST_GEOMETRY_OPERATORS", line 162
тоже не получается, так как указанные строки не проясняют суть проблемы и, возможно, вообще к ней не относятся:
SDE.ST_GEOMETRY_SHAPELIB_PKG
+
create or replace Package st_geometry_shapelib_pkg AS
/******************************************************************************
name: iso_Shapelib
purpose:

revisions:
ver date author description
--------- ---------- --------------- ------------------------------------
1.0 3/6/2005 1. created this package.
******************************************************************************/

c_package_release Constant pls_integer := 1111;

Procedure geometryfromtext (shptxt IN clob,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
Type IN number,
numpts IN Out number,
entity IN Out number,
minx IN Out number,
miny IN Out number,
maxx IN Out number,
maxy IN Out number,
minz IN Out number,
maxz IN Out number,
minm IN Out number,
maxm IN Out number,
area IN Out number,
len IN Out number,
points IN Out blob);

Procedure astext (srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
pls_numpts IN number,
pls_entity IN number,
points IN blob,
shptxt IN Out clob);

Procedure spatialrelations1 (relation IN number,
str_val IN varchar2,
s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_srid IN number,
s2_false_x IN number,
s2_false_y IN number,
s2_xyunits IN number,
s2_false_z IN number,
s2_zunits IN number,
s2_false_m IN number,
s2_munits IN number,
s2_proj_str IN varchar2,
s2_numpts IN number,
s2_entity IN number,
s2_points IN blob,
has_relation IN Out number);

Procedure spatialrelations2 (relation IN number,
str_val IN varchar2,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_numpts IN number,
s2_entity IN number,
s2_points IN blob,
has_relation IN Out number);

Procedure asbinary (srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
Type IN number,
numpts IN number,
points IN blob,
wkb_blob IN Out blob);

Procedure geomfromshape (Function IN number,
shp_blob IN blob,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
numpts IN Out number,
entity IN Out number,
minx IN Out number,
miny IN Out number,
maxx IN Out number,
maxy IN Out number,
minz IN Out number,
maxz IN Out number,
minm IN Out number,
maxm IN Out number,
area IN Out number,
len IN Out number,
points IN Out blob);

Procedure getshape (shp_entity IN number,
shp_numpts IN number,
shp_blob IN blob,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
numpts IN Out number);

Procedure geom_operation (operation IN number,
in_value1 IN number,
in_value2 IN number,
in_value3 IN number,
s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_minx IN Out number,
s2_miny IN Out number,
s2_maxx IN Out number,
s2_maxy IN Out number,
s2_minz IN Out number,
s2_maxz IN Out number,
s2_minm IN Out number,
s2_maxm IN Out number,
s2_area IN Out number,
s2_len IN Out number,
s2_points IN Out blob);

Procedure coorddim (s1_points IN blob,
typeval IN Out number);

Procedure envelope (s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_minx IN Out number,
s2_miny IN Out number,
s2_maxx IN Out number,
s2_maxy IN Out number,
s2_minz IN Out number,
s2_maxz IN Out number,
s2_minm IN Out number,
s2_maxm IN Out number,
s2_area IN Out number,
s2_len IN Out number,
s2_points IN Out blob);

Procedure getdimtype (s1_points IN blob,
typeval IN Out number);

Procedure isclosed (s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
isring IN number,
value IN Out number);

Procedure issimple (s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
value IN Out number);

Procedure spatial_operations1 (operation IN number,
s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_srid IN number,
s2_false_x IN number,
s2_false_y IN number,
s2_xyunits IN number,
s2_false_z IN number,
s2_zunits IN number,
s2_false_m IN number,
s2_munits IN number,
s2_proj_str IN varchar2,
s2_numpts IN number,
s2_entity IN number,
s2_points IN blob,
s3_numpts IN Out number,
s3_entity IN Out number,
s3_minx IN Out number,
s3_miny IN Out number,
s3_maxx IN Out number,
s3_maxy IN Out number,
s3_minz IN Out number,
s3_maxz IN Out number,
s3_minm IN Out number,
s3_maxm IN Out number,
s3_area IN Out number,
s3_len IN Out number,
s3_points IN Out blob);

Procedure spatial_operations2 (operation IN number,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_numpts IN number,
s2_entity IN number,
s2_points IN blob,
s3_numpts IN Out number,
s3_entity IN Out number,
s3_minx IN Out number,
s3_miny IN Out number,
s3_maxx IN Out number,
s3_maxy IN Out number,
s3_minz IN Out number,
s3_maxz IN Out number,
s3_minm IN Out number,
s3_maxm IN Out number,
s3_area IN Out number,
s3_len IN Out number,
s3_points IN Out blob);

Procedure getnumvalue (operation IN number,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
value IN Out number);

Procedure transform (geotranid IN number,
s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_minx IN number,
s1_miny IN number,
s1_maxx IN number,
s1_maxy IN number,
s1_minz IN number,
s1_maxz IN number,
s1_minm IN number,
s1_maxm IN number,
s1_area IN number,
s1_len IN number,
s1_points IN blob,
s2_srid IN number,
s2_false_x IN number,
s2_false_y IN number,
s2_xyunits IN number,
s2_false_z IN number,
s2_zunits IN number,
s2_false_m IN number,
s2_munits IN number,
s2_proj_str IN varchar2,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_minx IN Out number,
s2_miny IN Out number,
s2_maxx IN Out number,
s2_maxy IN Out number,
s2_minz IN Out number,
s2_maxz IN Out number,
s2_minm IN Out number,
s2_maxm IN Out number,
s2_area IN Out number,
s2_len IN Out number,
s2_points IN Out blob);

Procedure getfeature (s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_numparts IN Out number,
s2_parts IN Out SDE.int_array_tab,
s2_num_subparts IN Out number,
s2_subparts IN Out SDE.int_array_tab,
s2_properties IN Out number,
s2_x IN Out SDE.flt_array_tab,
s2_y IN Out SDE.flt_array_tab,
s2_z IN Out SDE.flt_array_tab,
s2_m IN Out SDE.flt_array_tab);

Procedure gen_cell_arrays (s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_minx IN number,
s1_miny IN number,
s1_maxx IN number,
s1_maxy IN number,
s1_points IN blob,
operation IN number,
distance IN number,
grid IN number,
grid2 IN number,
grid3 IN number,
num_parent_cell IN Out number,
parent_cell_t IN Out SDE.int_array_tab,
num_tess_cell IN Out number,
tess_cell_t IN Out SDE.int_array_tab,
grid1_new IN Out number,
grid2_new IN OUT number,
grid3_new IN OUT number);

Procedure test_features (operation IN number,
s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_minx IN number,
s1_miny IN number,
s1_maxx IN number,
s1_maxy IN number,
s1_points IN blob,
distance IN number,
bnd_rids_cnt IN number,
entity IN SDE.int_array_tab,
numpts IN SDE.int_array_tab,
srid IN SDE.int_array_tab,
points IN SDE.blob_array_tab,
row_id IN SDE.bnd_rowid_tab,
rid_array IN Out SDE.bnd_rowid_tab,
rid_array_cnt IN Out number);

Procedure test_features2 (operation IN number,
s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s2_srid IN number,
s2_false_x IN number,
s2_false_y IN number,
s2_xyunits IN number,
s2_false_z IN number,
s2_zunits IN number,
s2_false_m IN number,
s2_munits IN number,
s2_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_minx IN number,
s1_miny IN number,
s1_maxx IN number,
s1_maxy IN number,
s1_points IN blob,
distance IN number,
bnd_rids_cnt IN number,
entity IN SDE.int_array_tab,
numpts IN SDE.int_array_tab,
srid IN SDE.int_array_tab,
points IN SDE.blob_array_tab,
row_id IN SDE.bnd_rowid_tab,
rid_array IN Out SDE.bnd_rowid_tab,
rid_array_cnt IN Out number);

Procedure verify (s1_srid IN number,
s1_false_x IN number,
s1_false_y IN number,
s1_xyunits IN number,
s1_false_z IN number,
s1_zunits IN number,
s1_false_m IN number,
s1_munits IN number,
s1_proj_str IN varchar2,
s1_numpts IN number,
s1_entity IN number,
s1_points IN blob,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_minx IN Out number,
s2_miny IN Out number,
s2_maxx IN Out number,
s2_maxy IN Out number,
s2_minz IN Out number,
s2_maxz IN Out number,
s2_minm IN Out number,
s2_maxm IN Out number,
s2_area IN Out number,
s2_len IN Out number,
s2_points IN Out blob);

Procedure generate_ellipse (center_x IN number,
center_y IN number,
center_z IN number,
center_m IN number,
semiMajorAxis IN number,
semiMinorAxis IN number,
angle IN number,
numpts IN number,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_minx IN Out number,
s2_miny IN Out number,
s2_maxx IN Out number,
s2_maxy IN Out number,
s2_minz IN Out number,
s2_maxz IN Out number,
s2_minm IN Out number,
s2_maxm IN Out number,
s2_area IN Out number,
s2_len IN Out number,
s2_points IN Out blob);

Procedure generate_circle (center_x IN number,
center_y IN number,
center_z IN number,
center_m IN number,
radius IN number,
numpts IN number,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_minx IN Out number,
s2_miny IN Out number,
s2_maxx IN Out number,
s2_maxy IN Out number,
s2_minz IN Out number,
s2_maxz IN Out number,
s2_minm IN Out number,
s2_maxm IN Out number,
s2_area IN Out number,
s2_len IN Out number,
s2_points IN Out blob);

Procedure generate_wedge (center_x IN number,
center_y IN number,
center_z IN number,
center_m IN number,
startAngle IN number,
endAngle IN number,
outerRadius IN number,
innerRadius IN number,
numpts IN number,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
s2_numpts IN Out number,
s2_entity IN Out number,
s2_minx IN Out number,
s2_miny IN Out number,
s2_maxx IN Out number,
s2_maxy IN Out number,
s2_minz IN Out number,
s2_maxz IN Out number,
s2_minm IN Out number,
s2_maxm IN Out number,
s2_area IN Out number,
s2_len IN Out number,
s2_points IN Out blob);

Procedure sdexml_to_text (xml IN blob,
text_clob IN Out clob);

End st_geometry_shapelib_pkg;


SDE.ST_GEOMETRY_OPERATORS
+
create or replace Package st_geometry_operators Authid current_user
/***********************************************************************
*
*n {st_Geometry_Operators.sps} -- st_Geometry operators.
*
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*
*p purpose:
* this pl/sql package specification defines operators
* to support the st_Geometry type.
*e
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*
*x legalese:
*
* copyright 1992-2004 esri
*
* trade secrets: esri proprietary and confidential
* unpublished material - all rights reserved under the
* copyright laws of the united states.
*
* for additional information, contact:
* environmental systems research institute, inc.
* attn: contracts dept
* 380 new york street
* redlands, california, usa 92373
*
* email: contracts@esri.com
*
*e
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*
*h history:
*
* kevin watt 12/02/04 original coding.
*e
***********************************************************************/
IS

c_package_release Constant pls_integer := 1123;

mtrue Constant pls_integer := 1;
mfalse Constant pls_integer := 0;

-- st_Geometry operator functions (isocomn.h st_Geometry_Operators enum)

geomfromshape Constant pls_integer := 1;
pointfromshape Constant pls_integer := 2;
linefromshape Constant pls_integer := 3;
polyfromshape Constant pls_integer := 4;
mpointfromshape Constant pls_integer := 5;
mlinefromshape Constant pls_integer := 6;
mpolyfromshape Constant pls_integer := 7;
st_geomfromwkb Constant pls_integer := 8;
st_pointfromwkb Constant pls_integer := 9;
st_linefromwkb Constant pls_integer := 10;
st_polyfromwkb Constant pls_integer := 11;
st_mpointfromwkb Constant pls_integer := 12;
st_mlinefromwkb Constant pls_integer := 13;
st_mpolyfromwkb Constant pls_integer := 14;
st_boundary Constant pls_integer := 15;
st_buffer Constant pls_integer := 16;
st_centroid Constant pls_integer := 17;
st_convexhull Constant pls_integer := 18;
st_startpoint Constant pls_integer := 19;
st_endpoint Constant pls_integer := 20;
st_linestringn Constant pls_integer := 21;
st_pointonsurface Constant pls_integer := 22;
st_exteriorring Constant pls_integer := 23;
st_interiorringn Constant pls_integer := 24;
st_numinteriorring Constant pls_integer := 25;
st_numgeometries Constant pls_integer := 26;
st_geometryn Constant pls_integer := 27;
st_difference Constant pls_integer := 28;
st_union Constant pls_integer := 29;
st_symmetricdiff Constant pls_integer := 30;
st_pointn Constant pls_integer := 31;
st_intersection Constant pls_integer := 32;
st_transform Constant pls_integer := 33;
st_verify Constant pls_integer := 34;

Function st_astext_f(prim SDE.st_geometry)
Return clob deterministic;

Function st_asbinary_f(prim SDE.st_geometry)
Return blob deterministic;

Function st_geomfromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry deterministic;

Function st_pointfromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry deterministic;

Function st_linefromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry deterministic;

Function st_polyfromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry deterministic;

Function st_mpointfromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry deterministic;

Function st_mlinefromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry deterministic;

Function st_mpolyfromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry deterministic;

Function st_boundary_f(prim SDE.st_geometry)
Return SDE.st_geometry deterministic;

Function st_coorddim_f(prim SDE.st_geometry)
Return number deterministic;

Function st_envelope_f(prim SDE.st_geometry)
Return SDE.st_polygon deterministic;

Function st_geometrytype_f(prim SDE.st_geometry)
Return varchar2 deterministic;

Function st_is3d_f(prim SDE.st_geometry)
Return number deterministic;

Function st_ismeasured_f(prim SDE.st_geometry)
Return number deterministic;

Function st_isclosed_f(prim SDE.st_geometry)
Return number deterministic;

Function st_isempty_f(prim SDE.st_geometry)
Return number deterministic;

Function st_isring_f(prim SDE.st_geometry)
Return number deterministic;

Function st_issimple_f (prim SDE.st_geometry)
Return number deterministic;

Function st_area_f(prim SDE.st_geometry)
Return number deterministic;

Function st_areaunits_f(prim SDE.st_geometry,unit varchar2)
Return number deterministic;

Function st_buffer_f(prim SDE.st_geometry,distance number)
Return SDE.st_geometry deterministic;

Function st_centroid_f(prim SDE.st_geometry)
Return SDE.st_geometry deterministic;

Function st_convexhull_f(prim SDE.st_geometry)
Return SDE.st_geometry deterministic;

Function st_dimension_f(prim SDE.st_geometry)
Return number deterministic;

Function st_startpoint_f (prim SDE.st_geometry)
Return SDE.st_point deterministic;

Function st_endpoint_f (prim SDE.st_geometry)
Return SDE.st_point deterministic;

Function st_pointonsurface_f (prim SDE.st_geometry)
Return SDE.st_point deterministic;

Function st_exteriorring_f (prim SDE.st_geometry)
Return SDE.st_linestring deterministic;

Function st_interiorringn_f (prim SDE.st_geometry,ring_pos number)
Return SDE.st_linestring deterministic;

Function st_numinteriorring_f (prim SDE.st_geometry)
Return number deterministic;

Function st_numgeometries_f (prim SDE.st_geometry)
Return number deterministic;

Function st_geometryn_f (prim SDE.st_geometry,position number)
Return SDE.st_geometry;

Function st_difference_f(shape1 SDE.st_geometry,shape2 SDE.st_geometry)
Return SDE.st_geometry deterministic;

Function st_union_f (shape1 SDE.st_geometry,shape2 SDE.st_geometry)
Return SDE.st_geometry deterministic;

Function st_symmetricdiff_f (shape1 SDE.st_geometry,shape2 SDE.st_geometry)
Return SDE.st_geometry deterministic;

Function st_pointn_f (prim SDE.st_geometry,point_pos number)
Return SDE.st_point deterministic;

Function st_intersection_f (shape1 SDE.st_geometry,shape2 SDE.st_geometry)
Return SDE.st_geometry deterministic;

Function st_transform_f(prim SDE.st_geometry,srid number)
Return SDE.st_geometry deterministic;

Function st_transform_geotranid_f(prim SDE.st_geometry,srid number,geotranid number)
Return SDE.st_geometry deterministic;

Function st_entity_f (prim SDE.st_geometry)
Return number;

Function st_numpoints_f (prim SDE.st_geometry)
Return number;

Function st_minx_f (prim SDE.st_geometry)
Return number;

Function st_maxx_f (prim SDE.st_geometry)
Return number;

Function st_miny_f (prim SDE.st_geometry)
Return number;

Function st_maxy_f (prim SDE.st_geometry)
Return number;

Function st_minz_f (prim SDE.st_geometry)
Return number;

Function st_maxz_f (prim SDE.st_geometry)
Return number;

Function st_minm_f (prim SDE.st_geometry)
Return number;

Function st_maxm_f (prim SDE.st_geometry)
Return number;

Function st_length_f (prim SDE.st_geometry)
Return number;

Function st_srid_f (prim SDE.st_geometry)
Return number;

Function st_x_f (prim SDE.st_geometry)
Return number deterministic;

Function st_y_f (prim SDE.st_geometry)
Return number deterministic;

Function st_z_f (prim SDE.st_geometry)
Return number deterministic;

Function st_m_f (prim SDE.st_geometry)
Return number deterministic;

Function st_distance_f(shape1 SDE.st_geometry,shape2 SDE.st_geometry)
Return number deterministic;

Function st_distance_f(shape1 SDE.st_geometry,shape2 SDE.st_geometry,unit varchar2)
Return number deterministic;

Function st_disjoint_f(shape1 SDE.st_geometry,shape2 SDE.st_geometry)
Return number deterministic;

Procedure transform_srch_shape (shape IN SDE.st_geometry,
shape_out OUT SDE.st_geometry,
from_srid IN SDE.st_spref_util.srid_t,
to_srid IN SDE.st_spref_util.srid_t);

Function st_verify_f (shape SDE.st_geometry)
Return SDE.st_geometry deterministic;

Pragma Restrict_References (st_geometry_operators,wnds);

End st_geometry_operators;




Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
st_shapelib.dll от ArcGIS 10 с крайним сервис-паком, какой нашел (кажется, sp5) - версия 10.0.5.2063 от 22.05.2012



Буду рад любым гипотезам!


Когда все способы испробованы, а результата все нет, - прочтите наконец инструкцию!
22 сен 17, 10:29    [20814704]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
Раз нет версий, спрошу по -другому.

По какой причине внешняя хранимая процедура может не отрабатывать при ее вызове через OCI, тогда как из SQL Developer-а она же отрабатывает нормально?
26 сен 17, 13:36    [20823700]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4905
MustDie
указанные строки не проясняют суть проблемы и, возможно, вообще к ней не относятся
Это должно было вызвать некоторые подозрения что ты смотришь не там. Теперь загляни в тело вместо спеки.
26 сен 17, 14:03    [20823828]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5598
MustDie,

Откуда уверенность, что константно заданный блоб в анонимном блоке совпадает с типом и значением биндовой переменной при вызове через OCI?
26 сен 17, 14:08    [20823848]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
[quot dbms_photoshop]
MustDie
Теперь загляни в тело вместо спеки.

Не подскажете, как? С Ораклом я не глубоко знаком.
Все, что нашел - под спойлерами в первом сообщении.
Реально речь идет про функционал, лежащий в dll-ке от ArcGIS и прикрученной к БД (st_shapelib.dll).
Как заглянуть в тело я не знаю.
26 сен 17, 14:15    [20823882]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
env
MustDie,

Откуда уверенность, что константно заданный блоб в анонимном блоке совпадает с типом и значением биндовой переменной при вызове через OCI?


в качестве эксперимента я добавил blob-поле в ту же таблицу, куда записал значение через биндованную переменную.
после чего в sql developer вызвал ту же ST_GeomFromWKB на этот уже записанный в таблицу blob.
всё отработало корректно.
на основании этого сделал вывод, что blob через OCI я передаю корректно, и ST_GeomFromWKB его понимает - на выходе нужная геометрия.
кроме того, этот же blob я передаю в конструктор SDO_GEOMETRY и получаю корректную геометрию.
проблема возникает именно тогда, когда идет попытка передать биндованный блоб как параметр сразу в запрос, где есть ST_GeomFromWKB.
26 сен 17, 14:22    [20823908]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5598
MustDie,

добавил blob-поле в ту же таблицу, куда записал значение через биндованную переменную.
после чего в sql developer вызвал ту же ST_GeomFromWKB на этот уже записанный в таблицу blob.
всё отработало корректно.
на основании этого сделал вывод, что blob через OCI я передаю корректно

неправильный вывод

С учётом того, что в вызове
SDE.ST_GeomFromWKB
нет указания пакета, нет никакой гарантии, что вызывается процедура принимающая блоб.

Поэтому цитата выше будет работать для случая - "успешно проходит неявная конвертация типа биндовой переменной в блоб", "не проходит конвертация типа биндовой переменной в тип описанный в сигнатуре функции" и "успешно проходит конвертация блоба в тип описанный в сигнатуре функции".
26 сен 17, 14:38    [20823994]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5598
MustDie
Не подскажете, как?

select *
from dba_source
where owner = 'SYS' and name = 'STANDARD' and type = 'PACKAGE BODY' and line = 5;

Своё подставишь сам.
26 сен 17, 14:42    [20824017]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
MustDie
dbms_photoshop
Теперь загляни в тело вместо спеки.


Не подскажете, как? С Ораклом я не глубоко знаком.
Все, что нашел - под спойлерами в первом сообщении.
Реально речь идет про функционал, лежащий в dll-ке от ArcGIS и прикрученной к БД (st_shapelib.dll).
Как заглянуть в тело я не знаю.



Так, кое-что посмотреть получилось... Но не всё.
В "Body" SDE.ST_GEOMETRY_OPERATORS проблемная строчка 162 выделена цветом:

+
Function st_geomfromwkb_f(wkb_blob blob,srid number)
Return SDE.st_geometry
IS
  spref         SDE.spx_util.spatial_ref_record_t;
  temp          varchar2(1);
  tempraw       raw(1);
  minz          number;
  maxz          number;
  minm          number;
  maxm          number;
  rc            number;
  shape         SDE.st_geometry := SDE.st_geometry(0,0,0,0,0,0,0,0,0,0,0,0,0,empty_blob());
  len           integer;

Begin
  
  If wkb_blob IS NULL Then
    return NULL;
  End If;
    
  len := dbms_lob.getlength(wkb_blob);
  If len = 0 Then
    return shape;
  End If;

  spref.srid := srid;
  rc := SDE.st_spref_util.select_spref(spref);
  If rc != SDE.st_type_user.se_success THEN
    raise_application_error (SDE.st_type_util.st_no_srid,'srid '||spref.srid||
                             ' does not exist in st_spatial_references table.');
  End If;

  shape.points := empty_blob();
  shape.numpts := 0;
  shape.entity := 0;
  shape.minx   := 0;
  shape.miny   := 0;
  shape.maxx   := 0;
  shape.maxy   := 0;
  shape.area   := 0;
  shape.len    := 0;
  shape.minz   := NULL;
  shape.maxz   := NULL;
  shape.minm   := NULL;
  shape.maxm   := NULL;
 
  temp := lpad('a', 1, 'a');
  tempraw := utl_raw.cast_to_raw (temp);
  shape.points := tempraw;

[color=red]  SDE.st_geometry_shapelib_pkg.geomfromshape(SDE.st_geometry_operators.st_geomfromwkb,wkb_blob,spref.srid,spref.x_offset,
                                             spref.y_offset,spref.xyunits,spref.z_offset,spref.z_scale,
                                             spref.m_offset,spref.m_scale,spref.Definition,shape.numpts,
                                             shape.entity,shape.minx,shape.miny,shape.maxx,shape.maxy,
                                             shape.minz,shape.maxz,shape.minm,shape.maxm,shape.area,shape.len,shape.points);[/color]
    
  if(shape.numpts IS NULL and shape.entity = 0) then
    shape.numpts    := 0;
    shape.minx      := NULL;
    shape.maxx      := NULL;
    shape.miny      := NULL;
    shape.maxy      := NULL;
    shape.minz      := NULL;
    shape.maxz      := NULL;
    shape.minm      := NULL;
    shape.maxm      := NULL;
  End if;
           
  shape.srid := srid;							   
      
  Return(shape);

End st_geomfromwkb_f;


Это ссылка на функцию в SDE.ST_GEOMETRY_SHAPELIB_PKG в стоке 237 - geomfromshape. Но это уже "внешняя хранимка" - в DLL.


+
Procedure geomfromshape (Function IN number,
shp_blob IN blob,
srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
numpts IN Out number,
entity IN Out number,
minx IN Out number,
miny IN Out number,
maxx IN Out number,
maxy IN Out number,
minz IN Out number,
maxz IN Out number,
minm IN Out number,
maxm IN Out number,
area IN Out number,
len IN Out number,
points IN Out blob)
AS
language c
name "GeomFromShape"
library st_shapelib

WITH CONTEXT
parameters (CONTEXT,
Function ocinumber,
shp_blob ociloblocator,shp_blob Indicator short,
srid ocinumber,
false_x ocinumber,
false_y ocinumber,
xyunits ocinumber,
false_z ocinumber,
zunits ocinumber,
false_m ocinumber,
munits ocinumber,
proj_str string,proj_str Indicator short,proj_str length int,
numpts ocinumber,
entity ocinumber,
minx ocinumber,
miny ocinumber,
maxx ocinumber,
maxy ocinumber,
minz ocinumber,minz Indicator short,
maxz ocinumber,maxz Indicator short,
minm ocinumber,minm Indicator short,
maxm ocinumber,maxm Indicator short,
area ocinumber,
len ocinumber,
points ociloblocator,points Indicator short);


Исходников нет. Посмотреть глубже не получится. Да и стоит ли?
Ведь вызов из анонимного sql-блока проходит успешно. Значит библиотека прикручена и функция жива.
Проблема с использованием этой функции совместно с биндованным блобом.
26 сен 17, 15:03    [20824138]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
env
MustDie
Не подскажете, как?

select *
from dba_source
where owner = 'SYS' and name = 'STANDARD' and type = 'PACKAGE BODY' and line = 5;

Своё подставишь сам.


Спасибо! Буду знать на будущее. Пока обошелся интерфейсом sql developer-а и посмотрел тело пакетов.




env
С учётом того, что в вызове
SDE.ST_GeomFromWKB
нет указания пакета, нет никакой гарантии, что вызывается процедура принимающая блоб.

Поэтому цитата выше будет работать для случая - "успешно проходит неявная конвертация типа биндовой переменной в блоб", "не проходит конвертация типа биндовой переменной в тип описанный в сигнатуре функции" и "успешно проходит конвертация блоба в тип описанный в сигнатуре функции".


Возможно, я не совсем понял, что имелось в виду, но если речь идет про "перегруженные" функции (или как они называются в Oracle - не знаю), то других функций ST_GeomFromWKB нет.

На всякий случай попробовал вместо
SDE.ST_GeomFromWKB


такой вызов:
SDE.ST_GEOMETRY_OPERATORS.ST_GeomFromWKB_f


Картина та же - в sql developer отработало, через OCI - нет.

Да и трассировка
Oracle
ORA-03001: unimplemented feature
ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 237
ORA-06512: at "SDE.ST_GEOMETRY_OPERATORS", line 162

говорит о том, что вызывается нужная функция, но она почему-то не может достучаться до библиотеки с внешней процедурой.

При этом другие функции из этой DLL вызываются через OCI нормально. Правда, там через бинд blob не пишется, а читается.
26 сен 17, 15:35    [20824260]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
Попробовал передать не BLOB, а CLOB, передав в него 16-ричную последовательность и заменив тест запроса на
UPDATE "SDE"."MYTABLE" SET "SHAPE" = SDE.ST_GeomFromWKB(HEXTORAW(to_char(:GEOM)), 3405) WHERE "OBJECTID" = 1

Получил абсолютно ту же ошибку.

Да, забыл сказать, что, поскольку передаваемый BLOB является параметром для функции внутри запроса, то приходиться для него создавать временный локатор (OCILobCreateTemporary). Хотя это вряд ли на что-то влияет.

Есть еще предположения, почему внешняя хранимая процедура может не отрабатывать при ее вызове через OCI, тогда как из SQL Developer-а она же отрабатывает нормально?
27 сен 17, 18:10    [20827517]     Ответить | Цитировать Сообщить модератору
 Re: OCI + ArcSDE = Проблема записи SDE.ST_GeomFromWKB через OCILobLocator  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 221
Куда-то исчезла функция исправления своих сообщений. Хотел поправить название темы, но не могу.


В общем, проблема звучит несколько по-другому.
OCILobLocator тут не причем.

Просто любой вызов SDE.ST_GeomFromWKB через OCI приводит к ошибке. Из анонимного sql-блока вызывается без проблем.

Попробовал следующую комбинацию:
в таблицу, где есть поле St_geometry, добавил еще поле BLOB;
через OCI одной командой записал в него данные;
второй командой через OCI попробовал сделать update поля St_geometry из поля BLOB через ST_GeomFromWKB.

UPDATE "SDE"."MYTABLE" SET "SHAPE" = SDE.ST_GeomFromWKB("SHAPE_BLOB", 3405) WHERE "ID"=1;


Получаю ту же ошибку.
ORA
ORA-03001: unimplemented feature
ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 237
ORA-06512: at "SDE.ST_GEOMETRY_OPERATORS", line 162


Что говорит о том, что происходит где-то сбой на этапе вызова внешней хранимой процедуры geomfromshape() из библиотеки "st_shapelib.dll" (см. SDE.ST_GEOMETRY_SHAPELIB_PKG).


Тот же самый UPDATE, но выполненный из SQL Developer-а, отрабатывает хорошо.

Другие хранимые процедуры из библиотеки "st_shapelib.dll" вызываются без проблем, в том числе и через OCI.

Всё выполняется от имени одного и того же пользователя, то есть права тут не причем.

Вопрос: куда копать?
Почему одна и та же внешняя хранимка в plsql выполняется, а через oci - нет?
2 окт 17, 16:45    [20836882]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить