Найти строку с проблемной формой (пространственный тип SDE.ST_GEOMETRY)

Оракул 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 найти конкретную строку, вызывающую ошибку?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу создать встроенную функцию 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, если переменная не используется?

Другие вопросы по теме