Циклические таблицы с подзапросами Oracle - PullRequest
1 голос
/ 22 июня 2011

Я хочу запустить функцию проверки Oracle для каждой таблицы в базе данных, в которой есть подходящий столбец. Проверка может быть запущена для одной таблицы просто:

SELECT
count (*)
FROM
Table_name t
Where
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(t.Column_name, 0.005) <> 'TRUE';

Это прекрасно работает для отдельной таблицы, но, поскольку для тестирования имеется более 100, я хотел объединить ее с таблицей метаданных Oracle, используя подзапрос, и таким образом автоматизировать все это. Я придумал два варианта, но ни один из них не работает, я думаю, потому что у него возникают проблемы с передачей переменных изнутри подзапроса. Мои две попытки:

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 Ответ

5 голосов
/ 22 июня 2011

Вы никогда не можете ссылаться на значения столбцов как идентификаторы (таблицы, столбцы и т. Д.).Для этого вам нужно написать несколько 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...