使用Oracle子查询循环表

时间:2011-06-22 17:27:00

标签: oracle

我想针对具有合适列的数据库中的每个表运行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 - “表或视图不存在”

有人有什么想法吗?感谢。

1 个答案:

答案 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;