Подсчет строк из всех представлений в Oracle с условием - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь подсчитать количество всех строк из представлений в схеме oracle, и мой код работает нормально. Но когда я пытаюсь добавить условие, например where actv_ind = 'Y', я не могу заставить его работать. Есть предложения, как изменить код, чтобы он работал?

SELECT view_name,
TO_NUMBER(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) cnt from '||owner||'.'||view_name||
'where'||view_name||'.'||'actv_ind= Y')),'/ROWSET/ROW/CNT')) as VIEW_CNT
FROM all_views
WHERE owner = 'ABC'  AND view_name not in ('LINK$')

Я получаю сообщение об ошибке ACTV_IND: Invalid Identifier.

1 Ответ

1 голос
/ 18 июня 2020

Сообщения об ошибках от DBMS_XMLGEN не очень полезны, поэтому вам нужно быть очень осторожным с синтаксисом оператора SQL. Добавьте пробел до и после where и добавьте кавычки вокруг Y:

SELECT view_name,
TO_NUMBER(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) cnt from '||owner||'.'||view_name||
' where '||view_name||'.'||'actv_ind= ''Y''')),'/ROWSET/ROW/CNT')) as VIEW_CNT
FROM all_views
WHERE owner = 'ABC'  AND view_name not in ('LINK$');

Запрос по-прежнему предполагает, что каждое представление содержит столбец ACTV_IND. Если это не так, вы можете основывать запрос на DBA_TAB_COLUMNS WHERE COLUMN_NAME = 'ACTV_IND'.

Вот простой образец схемы, который я использовал для тестирования:

create user abc identified by abc;
create or replace view abc.view1 as select 1 id, 'Y' actv_ind from dual;
create or replace view abc.view2 as select 2 id, 'N' actv_ind from dual;
...