Oracle:更改架构中所有表的 SDO_GEOMETRY 的 SRID
Oracle: Change SDO_GEOMETRY's SRID for all tables in a schema
我需要更改特定模式(针对特定用户)中所有 table 的几何对象中的 SRID(将其设置为 NULL)
命令:
UPDATE my_table t SET t.geometrie.sdo_srid = null;
对于单个 table 效果很好。
当我尝试为特定所有者的所有 table 循环执行此操作时:
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 '||'
这可能是什么问题?
连接错误?打错电话了?
非常欢迎任何建议。
这个怎么样:
DBMS_OUTPUT.PUT_LINE('UPDATE ' || my_tables.table_name || ' t SET t.geometrie.sdo_srid = null');
-----------
您忘记从光标添加table名称。
除了 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;
/
这实际上限制了对实际空间表/列的更改。
请注意,您必须确保在执行前删除空间索引(并在执行后更新元数据并重新创建空间索引)。
BUT 我会质疑将 SRID 设置为 NULL 的原因。这将严重删除功能:您将无法再执行任何测量(面积、长度、距离)。此外,您将无法再将数据与具有明确 SRID 的数据(如 GPS 点)相关联。如果数据实际上是大地测量数据 (long/lat),那么 within_distance、缓冲区生成等操作基本上不再可能。
我们的建议是始终明确使用正确的 SRID。
我需要更改特定模式(针对特定用户)中所有 table 的几何对象中的 SRID(将其设置为 NULL)
命令:
UPDATE my_table t SET t.geometrie.sdo_srid = null;
对于单个 table 效果很好。 当我尝试为特定所有者的所有 table 循环执行此操作时:
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 '||'
这可能是什么问题? 连接错误?打错电话了?
非常欢迎任何建议。
这个怎么样:
DBMS_OUTPUT.PUT_LINE('UPDATE ' || my_tables.table_name || ' t SET t.geometrie.sdo_srid = null');
-----------
您忘记从光标添加table名称。
除了 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;
/
这实际上限制了对实际空间表/列的更改。
请注意,您必须确保在执行前删除空间索引(并在执行后更新元数据并重新创建空间索引)。
BUT 我会质疑将 SRID 设置为 NULL 的原因。这将严重删除功能:您将无法再执行任何测量(面积、长度、距离)。此外,您将无法再将数据与具有明确 SRID 的数据(如 GPS 点)相关联。如果数据实际上是大地测量数据 (long/lat),那么 within_distance、缓冲区生成等操作基本上不再可能。
我们的建议是始终明确使用正确的 SRID。