Пространственный оператор Oracle SDO_JOIN возвращает недопустимый номер ORA-01722

Во-первых, я создал метаданные в user_sdo_geom_metadata для двух таблиц «test_katt» и «test_del_ko». Каждая таблица имеет уникальный идентификатор (featureid). И в одной таблице есть геометрия точек, а в другой - полигоны.

--пример

insert into user_sdo_geom_metadata (table_name, column_name, diminfo,srid) values (
    'test_katt',  --table name
    'geometry',         
    SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Y',365000,627000,0.005), --box
    SDO_DIM_ELEMENT('X',28000,195000,0.005)), --box
    null
  );

Во-вторых: я создал пространственный индекс для обеих таблиц:

create index test_katt_idx 
          on test_katt (geometry) indextype is mdsys.spatial_index;

Наконец, я хотел объединить данные из точек в «test_katt» и данные из полигонов в «test_del_ko» на основе любого пространственного взаимодействия. В результате: Отчет об ошибке - ORA-01722: неверный номер

select *   
from test_del_ko dk, test_katt ka,  
                table (SDO_JOIN('test_del_ko', 'geometry',   
                'test_katt', 'geometry',   
                'mask = anyinteract') )a  
where a.rowid1 = dk.featureid  
and a.rowid2 = ka.featureid;

Мне еще не удалось создать результат с помощью SDO_JOIN, поэтому любая помощь в процедуре будет очень полезна. У нас есть база данных Oracle 12.


person Simon S    schedule 18.06.2020    source источник
comment
Пожалуйста, отредактируйте свой вопрос, указав полный минимальный воспроизводимый пример, включающий ВСЕ операторы DDL для ваших таблиц, включая CREATE TABLE, CREATE INDEX, вставки в таблицы метаданных для ВСЕХ таблиц, которые вы используете, и некоторые INSERT с некоторыми примерами данных, представляющих проблему. Тогда, если люди захотят помочь вам, у них есть сценарий, который они могут запустить, и им не нужно пытаться перепроектировать ваш код во что-то, что работает. Пожалуйста, помогите нам быть в состоянии помочь вам.   -  person MT0    schedule 18.06.2020


Ответы (1)


В вашем запросе a.rowid1 и a.rowid2 являются идентификаторами строк оракула в формате varchar2, и вы сравниваете их со столбцами featureid в своих таблицах, и я полагаю, что это числа. Вот почему у вас есть ошибка. Вместо этого используйте этот запрос:

select *   
from test_del_ko dk, test_katt ka,  
                table (SDO_JOIN('test_del_ko', 'geometry',   
                'test_katt', 'geometry',   
                'mask = anyinteract') )a  
where a.rowid1 = dk.rowid  
and a.rowid2 = ka.rowid;
person gsalem    schedule 18.06.2020
comment
Большое спасибо, я так благодарен. Теперь это работает как шарм. Это именно то, что я не понял об этом rowid. - person Simon S; 18.06.2020