我想针对具有合适列的数据库中的每个表运行Oracle验证函数。 验证可以简单地针对一个表运行:
SELECT
count (*)
FROM
Table_name t
Where
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(t.Column_name, 0.005) <> 'TRUE';
这适用于单个表,但由于有超过100个要测试,我想使用子查询将其与Oracle Metadata表合并,从而使整个事物自动化。我想出了两个变体,但都不起作用,我猜是因为它在从子查询中传递变量时遇到了麻烦。 我的两次尝试是:
SELECT TABLE_NAME tab, COLUMN_NAME col, (select count(*) from tab where sdo_geom.validate_geometry(tab.col, 0.005) <> 'TRUE')
From
All_Tab_Columns
where
owner = 'WCCDATA' and DATA_TYPE = 'SDO_GEOMETRY'
返回:
SQL错误:ORA-00904:“TAB”。“COL”:标识符无效 00904. 00000 - “%s:无效标识符”
和
SELECT count(*)
From
(SELECT
TABLE_NAME, COLUMN_NAME as col
FROM
All_Tab_Columns
where
owner = 'WCCDATA' and DATA_TYPE = 'SDO_GEOMETRY') subquery
WHERE sdo_geom.validate_geometry(subquery.col, 0.005) <> 'TRUE';
返回:
ORA-06512:在“MDSYS.SDO_GEOM”,第2204行 00942. 00000 - “表或视图不存在”
有人有什么想法吗?感谢。
答案 0 :(得分:5)
您不能将列值引用为标识符(表,列等)。为了做到这一点,你需要编写一些PL / SQL来动态创建和执行SQL,也许是这样的:
DECLARE
CURSOR cur_tables IS
SELECT table_name,
'SELECT count(*) From '
|| table_name
|| ' WHERE sdo_geom.validate_geometry('
|| column_name
|| ', 0.005) <> ''TRUE'''
AS dsql
FROM all_tab_columns
WHERE owner = 'WCCDATA' AND data_type = 'SDO_GEOMETRY';
v_count NUMBER;
BEGIN
FOR r_tables IN cur_tables LOOP
EXECUTE IMMEDIATE r_tables.dsql INTO v_count;
DBMS_OUTPUT.put_line(r_tables.table_name || ': ' || v_count);
END LOOP;
END;