如何从 all_views 获取单个视图的总记录数

Posted

技术标签:

【中文标题】如何从 all_views 获取单个视图的总记录数【英文标题】:How to get Total record count of individual views from all_views 【发布时间】:2015-01-30 05:53:32 【问题描述】:

。 请找到以下代码以供参考..

Declare
view_name     VARCHAR2(200);
v_str          VARCHAR2 (1000);
v_output     VARCHAR2(4000);

CURSOR tbl IS
     SELECT view_name 
     FROM all_views
     WHERE OWNER = SYS_CONTEXT( 'USERENV', 'CURRENT_SCHEMA')
     ORDER BY 1 ;
BEGIN
OPEN tbl ;
     LOOP
     FETCH tbl INTO view_name;
     EXIT WHEN tbl%NOTFOUND;
          v_str := 'Select '''|| view_name ||'     '' || count (*) from ' || view_name ;
          EXECUTE IMMEDIATE v_str INTO v_output;

          DBMS_OUTPUT.PUT_LINE(v_output);
     END LOOP;
CLOSE tbl;
END;

当前输出:

V_DSP_BUSINESS_DATE            10
V_DSP_DEPARTMENT               20
V_DSP_EMPLOYEE_DEACTIVATED     50
V_DSP_EMPLOYEE_GED             80

预期输出:

sum up the record count of all individual views

i.e 160

请帮忙。

【问题讨论】:

您能否使您的预期输出更清晰,即您只想要 160 没有视图名称或 160 对每个视图名称。 在循环内添加计数并将 dbms_output 放在结束循环之后。看我的回答。 【参考方案1】:

只需修改 LOOP 以总结每次获取 COUNT 的时间。

LOOP
FETCH tbl INTO view_name;
EXIT WHEN tbl%NOTFOUND;
     v_str := 'Select count (*) from ' || view_name ;
     EXECUTE IMMEDIATE v_str INTO v_cnt;
     v_cnt_tot := v_cnt_tot + v_cnt;


END LOOP;
DBMS_OUTPUT.PUT_LINE(v_cnt_tot);

确保声明了v_cntv_cnt_tot 变量。

如果您真的想在LOOProw-by-row 中执行此操作,请使用简单的CURSOR FOR LOOP,而不是声明CURSOR

类似的,

FOR i IN SELECT view_name 
     FROM all_views
     WHERE OWNER = SYS_CONTEXT( 'USERENV', 'CURRENT_SCHEMA')
LOOP
...

【讨论】:

不客气。如果解决了您的问题,请将其标记为已回答:-)【参考方案2】:

非常感谢您的帮助...:) 它奏效了。

请在下面找到最终代码

Declare
view_name     VARCHAR2(200);
v_str          VARCHAR2 (1000);
v_cnt     VARCHAR2(4000);
v_cnt_tot     VARCHAR2(4000);

CURSOR tbl IS
     SELECT view_name 
     FROM all_views
     WHERE OWNER = SYS_CONTEXT( 'USERENV', 'CURRENT_SCHEMA')
     ORDER BY 1 ;

BEGIN
 v_cnt_tot := 0;
OPEN tbl ;
     LOOP
     FETCH tbl INTO view_name;
     EXIT WHEN tbl%NOTFOUND;
          v_str := 'Select  count (*) as count from ' || view_name ;
          EXECUTE IMMEDIATE v_str INTO v_cnt;
          v_cnt_tot := v_cnt_tot + v_cnt;


     END LOOP;
    DBMS_OUTPUT.PUT_LINE(v_cnt_tot);
CLOSE tbl;
END;

【讨论】:

如果您使用的是 Oracle SQL Developer,请将其放在脚本的顶部:set serveroutput on;否则你会得到一个通用的 PL\SQL 脚本运行成功输出。

以上是关于如何从 all_views 获取单个视图的总记录数的主要内容,如果未能解决你的问题,请参考以下文章

查找多个刷入/刷出时间戳之间的总分钟数 - 从垂直行中选择多个记录并转换水平行

如何找到雪花中的总连接数

用于从 Hive 中获取单个表的最大值、最小值和其他列的相应值以及总记录数的数据库查询

如何在yii中获取每个用户的最新日期记录

如何在 prisma-binding npm 中获取总匹配记录数

如何在单个语句中的Northwind数据库的Order Details表中获取每个产品的总销售额?