Оракул 18с; Многопользовательская база геоданных ArcGIS 10.7.1:
У меня есть таблица GCSM_HC_ANNO, в которой есть столбец SHAPE (определяемый пользователем пространственный тип, называемый SDE.ST_GEOMETRY; тип геометрии = точки).
И у меня есть пространственный запрос, который выбирает точки GCSM_HC_ANNO, которые пространственно пересекают строку многоугольника в таблице BOUNDARY (ST_Intersects). Запрос выполняется без ошибок, если возвращаются только первые 50 строк:
select
anno.objectid,
anno.shape
from
city.boundary boundary
cross join
infrastr.gcsm_hc_anno anno
where
sde.st_intersects (boundary.shape, anno.shape) = 1
Но когда я нажимаю CTRL+End в наборе результатов в SQL Developer, чтобы вернуть все строки, я получаю ошибку:
ORA-20002: Error converting spatial reference (SHAPE2)
ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 740
ORA-06512: at "SDE.ST_GEOMETRY_OPERATORS", line 2836
ORA-06512: at "SDE.ST_GEOMETRY_OPERATORS", line 3698
ORA-06512: at "SDE.ST_RELATION_OPERATORS", line 339
Это говорит мне о проблеме с одним из SHAPES в GCSM_HC_ANNO.
Как с помощью SQL найти конкретную строку, вызывающую ошибку?
Я могу создать встроенную функцию PL/SQL (или обычную функцию).
Функция проверяет фигуры, пересекая их с ГРАНИЦЕЙ. Если пересечение прошло успешно, функция возвращает «нет ошибок». Но если есть проблема, то возвращает «ошибку».
Это позволяет мне отметить проблемную строку. Этот метод более полезен, чем исходный запрос, который выдает общую ошибку, но не сообщает, какая строка вызывает проблему.
with function check_shape(anno_shape sde.st_geometry, boundary_shape sde.st_geometry) return varchar2
is
v_test_result varchar2(10);
begin
select
sde.st_intersects (boundary_shape, anno_shape)
into
v_test_result
from
dual;
return 'no error';
exception
when others then
return 'error';
end;
select
anno.objectid,
anno.shape as anno_shape,
check_shape(anno.shape, boundary.shape) as check_shape
from
city.boundary boundary
cross join
infrastr.gcsm_hc_anno anno
where
check_shape(anno.shape, boundary.shape) = 'error'
Я открыт для идей по улучшению функции.
Связанный материал: Зачем нужен INTO в этой функции PL/SQL, если переменная не используется?