Oracle:为架构中的所有表更改SDO_GEOMETRY的SRID

问题描述 投票:1回答:2

我需要在特定模式中的所有表的几何对象中更改SRID(将其设置为NULL)(对于特定用户)

命令:

UPDATE my_table t SET t.geometrie.sdo_srid = null;

适用于单个表格。当我尝试在循环中为特定所有者的所有表执行此操作时:

BEGIN FOR my_tables IN ( SELECT TABLE_NAME from all_tables where OWNER = 'LANDWERTZONEN' AND TABLE_NAME NOT LIKE 'GOOM%' AND TABLE_NAME NOT LIKE '%BKP' ) LOOP DBMS_OUTPUT.PUT_LINE('UPDATE ' || my_tables || ' t SET t.geometrie.sdo_srid = null'); END LOOP; END;

我收到错误:

pls-00306 wrong number or types of arguments in call to '||'

这可能是什么问题?连接错了?错误的电话?

任何建议都非常欢迎。

oracle oracle-spatial srid
2个回答
0
投票

除了Littlefoot指出的语法错误之外,您可以扩展逻辑以实际执行更新,而不是打印出UPDATE语句:

DECLARE
  sql_stmt varchar2(256);
BEGIN
  FOR st IN (
    SELECT OWNER, TABLE_NAME, COLUMN_NAME 
    FROM all_tab_columns 
    WHERE OWNER = 'LANDWERTZONEN' 
    AND TABLE_NAME NOT LIKE 'GOOM%' 
    AND TABLE_NAME NOT LIKE '%BKP'
    AND DATA_TYPE = 'SDO_GEOMETRY'
  )
  LOOP
    sql_stmt := 'UPDATE ' || st.owner ||'.' || st.table_name || ' t SET t.'|| st.column_name ||'.sdo_srid = null';
    DBMS_OUTPUT.PUT_LINE('Executing ' || sql_stmt);
    execute immediate sql_stmt;
    COMMIT;
  END LOOP;
END;
/

这实际上限制了对实际空间表/列的更改。

请注意,必须确保在执行之前删除空间索引(并更新元数据并在执行后重新创建空间索引)。

但我会质疑将SRID设置为NULL的原因。这将严重消除功能:您将无法再执行任何测量(面积,长度,距离)。此外,您将无法再将数据与具有显式SRID的数据(如GPS点)相关联。如果数据实际上是大地测量(长/纬),那么像within_distance,缓冲区生成等操作基本上不再可能。

我们的建议是始终明确使用正确的SRID。


0
投票

这个怎么样:

DBMS_OUTPUT.PUT_LINE('UPDATE ' || my_tables.table_name || ' t SET t.geometrie.sdo_srid = null');
                                           -----------

您忘记从游标添加表名。

© www.soinside.com 2019 - 2024. All rights reserved.