Возможно, вам вообще не нужно прикасаться к вашей среде Maximo. Как насчет использования триггера на вашем рабочем столе? Этот триггер может затем автоматически заполнить идентификатор зоны из простого оператора выбора, который соответствует x и y зонам в таблице зон. Вот как это может выглядеть.
Предполагается, что ваши рабочие задания находятся в такой таблице:
create table work_orders (
wo_id number primary key,
x number,
y number,
zone_id number
);
и зоны в таблице, подобные этой
create table zones (
zone_id number primary key,
shape st_geometry
)
Тогда триггер будет таким:
create or replace trigger work_orders_fill_zone
before insert or update of x,y on work_orders
for each row
begin
select zone_id
into :new.zone_id
from zones
where sde.st_contains (zone_shape, sde.st_point (:new.x, :new.y, 4326) ) = 1;
end;
/
Некоторые предположения:
Столбцы x
и y
содержат координаты в долготе / широте WGS84 (не в какой-либо проекции или какой-либо другой системе координат долг / широта)
Зоны не перекрываются: поэтому точка рабочего задания всегда находится в одной и только одной зоне. Если нет, то запрос может вернуть несколько результатов, которые вам необходимо обработать.
Зоны полностью покрывают территорию, на которой могут выполняться ваши рабочие задания. Если местоположение рабочего задания может находиться за пределами всех ваших зон, то вам также необходимо это обработать (запрос не даст результата).
Столбцы x
и y
заполнены всегда. Если они являются необязательными, вам также необходимо обработать этот случай (установите zone_id
на NULL
, если x
или y
равно NULL
)
После этого при каждом добавлении нового рабочего задания в таблицу work_orders
столбец zone_id
будет автоматически обновляться.
Вы можете инициализировать zone_id
в существующих рабочих заданиях с помощью простого обновления:
update work_orders set x=x, y=y;
Это приведет к запуску триггера для каждой строки в таблице ... Может потребоваться некоторое время для завершения, если таблица большая.