我需要在特定架构中所有表的几何对象中更改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 '||'
这里有什么问题?错误的串联?电话错误?
任何建议都非常欢迎。
除了Littlefoot指出的语法错误外,您可以将逻辑扩展到实际执行更新而不是打印更新语句:
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点(相关联。如果数据实际上是大地的(长/lat(,那么诸如ins ins ins ins ins of ins of the,缓冲区生成...基本上是不可能的。
我们的建议是始终明确使用正确的srids。
怎么样:
DBMS_OUTPUT.PUT_LINE('UPDATE ' || my_tables.table_name || ' t SET t.geometrie.sdo_srid = null');
-----------
you 忘记添加光标的表名。