Oracle - 对结果集的每一行执行操作

时间:2013-10-01 14:36:18

标签: sql oracle ssrs-2008

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

此:

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

返回第一列,但我似乎无法找到将其与:

组合的方法
select count(*) from view_X

获取结果集的第二列。

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

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

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

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,那将会很好用。

答案 2 :(得分: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;
/

答案 3 :(得分:0)

在Oracle中cursors处获取。它们让您循环遍历结果集。完成后,您可以动态执行以下形式的SQL:

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

列表中的每个视图。