检查哪些视图有行

时间:2018-08-16 14:29:57

标签: sql database oracle view

我有一个包含300多个视图的数据库,其中大多数视图为空。 我需要知道哪些视图有行。 是否有查询来检查这些视图中的哪些具有行?

2 个答案:

答案 0 :(得分:4)

不,除了查询每个之外,别无他法。

即使那样也不是完美的,因为定义视图的查询可能引用诸如USERSYS_CONTEXT()之类的东西。或者,视图的基础表上可能存在行级安全(DBMS_RLS)策略。这就是说,一个视图可能没有适合您的任何行,但恰好在同一时间为另一个用户提供了行。

没有底线。

答案 1 :(得分:4)

您可以使用:

SELECT owner, view_name, cnt              
FROM all_views, XMLTABLE('/ROWSET/ROW' passing (
             dbms_xmlgen.getxmltype(REPLACE(REPLACE(
         'select COUNT(*) AS cnt from "<owner>"."<table_name>"', '<owner>', owner)
             , '<table_name>', view_name))) COLUMNS cnt INT)
WHERE cnt > 0;

编辑:

如果我们只想检查视图是否有行,则可以与COUNT交换EXISTS。这也应该提高性能。

SELECT owner, view_name, has_rows            
FROM all_views, XMLTABLE('/ROWSET/ROW' passing (
             dbms_xmlgen.getxmltype(REPLACE(REPLACE(
              'select CASE WHEN EXISTS(SELECT 1 from "<owner>"."<table_name>") 
              THEN 1 ELSE 0 END AS has_rows FROM dual', '<owner>', owner)
             , '<table_name>', view_name))) COLUMNS has_rows INT)
WHERE has_rows > 0;