【问题标题】:Oracle: Change SDO_GEOMETRY's SRID for all tables in a schemaOracle:更改模式中所有表的 SDO_GEOMETRY 的 SRID
【发布时间】:2018-02-06 18:10:16
【问题描述】:

我需要更改特定模式(针对特定用户)中所有表的几何对象中的 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


    【解决方案1】:

    除了 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 点)相关联。如果数据实际上是大地测量数据(long/lat),那么像 inside_distance、缓冲区生成等操作基本上不再可能。

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

    【讨论】:

    • 我知道不设置 SRID 通常不是一个好习惯。我们将 SRID 设置为 NULL 的原因是 GeoMedia(我们用来读取 Oracle Spatial 数据)的遗留问题以及我们必须适应的后续脚本。
    • 嗯,好的。这是有道理的。
    【解决方案2】:

    这个怎么样:

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

    忘记从游标中添加表名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多