2015-06-11 24 views
1

我已经改变了我的表的几何形状到一个新的表,只有两个字段(几何和SDO_RowID)使用游标使用空间数据更新表中的SQL开发

我需要的所有数据的在原始表格中并将其带到新表格中。我在新表中创建了列,现在我试图使用For Update Of游标来引入数据。

我只是不确定如何以正确的方式循环所有数据/使其工作。谢谢。

DECLARE 
    CURSOR OTTAWACOLLECTS IS 
    SELECT SHAPE_LENG, 
      CLASS, 
      SUBCLASSIF, 
      ROAD_NAME, 
      ROAD_TYPE, 
      ROAD_DIREC, 
      MUNICIPALI,ADDRESS_LE, 
      ADDRESS__1, 
      ADDESSS_RI, 
      ADDRESS_RI, ROAD_NAME_ 
    FROM OTTAWACOLLECTORS 
    WHERE OTTAWACOLLECTORS_NAD.SDO_ROWID = ROWID 
    FOR UPDATE OF OTTAWACOLLECTORS_NAD; 

BEGIN 
    FOR ROWID IN OTTAWACOLLECTS 
    LOOP 
     UPDATE OTTAWACOLLECTORS_NAD 
     SET SHAPE_LENG = OTTAWACOLLECTORS.SHAPE_LENG, 
      CLASS = OTTAWACOLLECTORS.CLASS, 
      SUBCLASSIF = OTTAWACOLLECTORS.SUBCLASSIF, 
      ROAD_NAME = OTTAWACOLLECTORS.ROAD_NAME, 
      ROAD_TYPE = OTTAWACOLLECTORS.ROAD_TYPE, 
      ROAD_DIREC = OTTAWACOLLECTORS.ROAD_DIREC, 
      MUNICIPALI = OTTAWACOLLECTORS.MUNICIPALI, 
      ADDRESS_LE = OTTAWACOLLECTORS.ADDRESS_LE, 
      ADDRESS__1 = OTTAWACOLLECTORS.ADDRESS__1, 
      ADDRESSS_RI = OTTAWACOLLECTORS.ADDESSS_RI, 
      ADDRESS_RI = OTTAWACOLLECTORS.ADDRESS_RI, 
      ROAD_NAME = OTTAWACOLLECTORS.ROAD_NAME_ 
     WHERE CURRENT OF OTTAWACOLLECTS; 
    END LOOP; 
END; 

回答

0

看起来你使用sdo_cs.transform_layer()函数得到了新表格。国际海事组织你只是用这种方法让你的生活变得不必要的复杂。有两种更简单的方法:

1)只需转换原始表格中的几何图形。或者,如果您在两个坐标系(原始的和新的)中都需要几何图形,那么只需在原始表中添加第二个几何图形列即可。您甚至可以通过触发器将它们链接起来,这样当“主”几何体得到更新时,转换的几何体会自动更新。

alter table ottawacollectors add geometry_nad do_geometry; 
update ottawacollectors set geometry_nad = sdo_cs.transform (geometry, <your new SRID>); 
commit; 

然后在附加列上添加元数据和空间索引。

好处是,您不需要处理两个单独的表格,这两个表格都具有您需要保持同步的相同内容。

2)或者,如果你真的想原始表的完整副本与转化的几何形状,然后就创建新表,并在同一时间变换,像这样:

create table ottawacollectors_nad as 
select ... (all columns) ..., sdo_cs.transform (geometry, <your new SRID>) geometry 
from ottawacollectors; 

或者更简单:

create table ottawacollectors_nad as select * from ottawacollectors; 

后跟:

update ottawacollectors_nad set geometry = sdo_cs.transform (geometry, <your new SRID>); 
commit; 

二者随后通常设立元数据和创建空间索引。