4

我需要查询帮助。该查询返回数据库中所有视图的列。我的最终目标是让整个结果集成为包含数据库中所有视图的一列,另一列包含每个对应表中存在的记录/行数。

这个:

SELECT DISTINCT OWNER, 
       OBJECT_NAME 
 FROM DBA_OBJECTS
WHERE OBJECT_TYPE = 'VIEW'
  AND OWNER = 'ADMIN'

返回第一列,但是我似乎找不到将其与以下内容结合的方法:

select count(*) from view_X

获取结果集的第二列。

任何帮助,将不胜感激。谢谢

4

4 回答 4

3

借助一些 XML 魔法,这可以通过一条语句来完成:

select object_name as view_name,
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from "'||owner||'"."'||object_name||'"')),'/ROWSET/ROW/C')) as row_count
from dba_objects
where object_type = 'VIEW'
  and owner = 'ADMIN'
order by 1;
于 2013-10-01T15:20:59.847 回答
2

这是一个硬汉。您不能select count(*) from view_X使用直接 SQL 加入或类似的东西,所以我能想到的最好的事情是一个接受视图名称并返回其计数的函数:

CREATE OR REPLACE FUNCTION ViewRowCount(viewName VARCHAR2) RETURN NUMBER
AS
  rowCount NUMBER := 0;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || viewName INTO rowCount;
  RETURN rowCount;
END;
/

函数到位后,您可以从查询中调用它:

SELECT DISTINCT OWNER, 
       OBJECT_NAME,
       ViewRowCount(OBJECT_NAME)
 FROM DBA_OBJECTS
WHERE OBJECT_TYPE = 'VIEW'
  AND OWNER = 'ADMIN';

顺便说一句,我认为您不需要DISTINCT此查询,但我今天没有 DBA 访问权限,所以我不能确定。记录计数将足够慢,因此如果在过滤之前存在重复项,DISTINCT则每个重复行都会计数,从而使其更慢。


还可以看看 Rachcha 的解决方案,它不需要像我的那样创建一个新对象(函数)。如果您要从前端调用,则需要使用类似我的答案的方法,但如果您要从 SQL*Plus 调用,Rachcha's 会很好地工作。

于 2013-10-01T14:57:15.297 回答
2

Ed Gibbs 提供了一个全面的答案。对于您正在寻找的内容,我有以下解决方案。

SET serveroutput ON;
DECLARE
    x INTEGER;
BEGIN
    FOR i IN (SELECT 'ADMIN' AS owner, object_name
                FROM all_objects
               WHERE object_type = 'VIEW'
                 AND owner = 'ADMIN') LOOP
        EXECUTE IMMEDIATE ('SELECT count(*) FROM ' || i.object_name) INTO x;
        dbms_output.put_line (i.owner || ' | ' || i.object_name || ' | ' || x);
    END LOOP;
END;
/
于 2013-10-01T15:00:58.667 回答
0

在 Oracle中使用游标。它们允许您遍历结果集。完成后,您可以动态执行以下形式的 sql:

EXECUTE IMMEDIATE 'select ''' || OBJECT_NAME || ''' count(*) FROM ' || OBJECT_NAME'

对于列表中的每个视图。

于 2013-10-01T14:55:08.540 回答