批量修改oracle資料庫中sdo_geometry欄位的SRID
阿新 • • 發佈:2019-02-07
1,在user_sdo_geom_metadata表中插入或者修改需要修改表的名稱,表中的geometry欄位名稱和srid。具體可參考該表的欄位。
INSERT INTO USER_SDO_GEOM_METADATA (table_name,column_name,DimInfo,srid)
VALUES (UPPER('TB_REALTIME_FIREDISRECORD_T'), UPPER('COORDINATES'),
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X',114.877478378889,119.644269545556,0.005),
MDSYS.SDO_DIM_ELEMENT('Y',29.395623565556,34.655112621111,0.005)
),
8307);
2,在修改欄位的srid之前,需要刪除該欄位上得空間索引:
drop index TB_PG_TOWERINFO_STATIONMAP_SPX;
3,使用遊標遍歷表中的欄位,修改geometry欄位的srid的值:
declare
geo sdo_geometry;
cursor pointer is
select T.STATIONMAP , T.TOWERID from DMSDKY.TB_PG_TOWERINFO t;
p pointer%rowtype;
begin
for p in pointer loop
geo := P.STATIONMAP;
if geo is not null then
if geo.sdo_srid is null then
geo.sdo_srid := 8307;
update DMSDKY.TB_PG_TOWERINFO t set T.STATIONMAP = geo where T.TOWERID = P.TOWERID;
COMMIT;
end if;
end if;
end loop;
end;
4,修改完之後再重新建立欄位上得索引,注意如果欄位中仍含有未修改的欄位值,則會出現ora-13365錯誤
create index TB_PG_TOWERINFO_STATIONMAP_SPX on TB_PG_TOWERINFO t (T.STATIONMAP ) indextype is mdsys.spatial_index;
INSERT INTO USER_SDO_GEOM_METADATA (table_name,column_name,DimInfo,srid)
VALUES (UPPER('TB_REALTIME_FIREDISRECORD_T'), UPPER('COORDINATES'),
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X',114.877478378889,119.644269545556,0.005),
MDSYS.SDO_DIM_ELEMENT('Y',29.395623565556,34.655112621111,0.005)
),
8307);
2,在修改欄位的srid之前,需要刪除該欄位上得空間索引:
drop index TB_PG_TOWERINFO_STATIONMAP_SPX;
3,使用遊標遍歷表中的欄位,修改geometry欄位的srid的值:
declare
geo sdo_geometry;
cursor pointer is
select T.STATIONMAP , T.TOWERID from DMSDKY.TB_PG_TOWERINFO t;
p pointer%rowtype;
begin
for p in pointer loop
geo := P.STATIONMAP;
if geo is not null then
if geo.sdo_srid is null then
geo.sdo_srid := 8307;
update DMSDKY.TB_PG_TOWERINFO t set T.STATIONMAP = geo where T.TOWERID = P.TOWERID;
COMMIT;
end if;
end if;
end loop;
end;
4,修改完之後再重新建立欄位上得索引,注意如果欄位中仍含有未修改的欄位值,則會出現ora-13365錯誤
create index TB_PG_TOWERINFO_STATIONMAP_SPX on TB_PG_TOWERINFO t (T.STATIONMAP ) indextype is mdsys.spatial_index;