获取每个表的计数

时间:2014-02-07 10:34:39

标签: oracle

我试图创建一个过程来获取与模式对应的所有表的总行数。 我正在进行一个存储表的总列表的游标,并且进一步迭代。即使没有测试功能。编译过程创建时出现以下错误。

create or replace
PROCEDURE PROC_TABLE_COUNT
AS
  table_count NUMBER;
  CURSOR total_tables
  IS
     SELECT table_name FROM dba_tables WHERE owner = 'OWNER_NAME';
BEGIN
  FOR i IN total_tables
  LOOP
  SELECT COUNT (*) INTO table_count FROM dba_tables db where db.table_name = i.table_name;
  END LOOP;
END PROC_TABLE_COUNT;


1)Error(7,6): PL/SQL: SQL Statement ignored
2)Error(7,33): PL/SQL: ORA-00942: table or view does not exist
3)Error(11,1): PL/SQL: SQL Statement ignored
4)Error(11,76): PL/SQL: ORA-00904: "I"."TABLE_NAME": invalid identifier
5)Error(11,76): PLS-00364: loop index variable 'I' use is invalid

问题1: 错误2(dba_tables)是否归因于授予被拒绝?通过右键单击过程名称,我尝试将权限分配给调试和执行。但仍然存在错误。 问题2: 关于无效标识符。为什么会出现这个错误?

UPDATE:

根据其中一条有价值的评论,我更改了查询,编译错误消失了。现在逻辑上存在一个问题。

create or replace procedure proc_tab_count as 
  table_count NUMBER;
  CURSOR total_tables
  IS
     SELECT table_name FROM user_tables; 
BEGIN
  FOR i IN total_tables
  LOOP
SELECT COUNT (*) INTO table_count FROM user_tables WHERE db.table_name = i.table_name; --Wrong logic here
    DBMS_OUTPUT.put_line(i.table_name||'-COUNT:'||table_count);
  END LOOP;
end proc_tab_count;

输出就像:

Table1 -COUNT:1
Table2 -COUNT:1
Table3 -COUNT:1
Table3 -COUNT:1
Table4 -COUNT:1
Table5 -COUNT:1

2 个答案:

答案 0 :(得分:0)

猜猜,您想要计算所有表格中的行数,我们需要动态 SQLEXCEUTE IMMEDIATE用于构建动态SQL,使OWNER.TABLE_NAME动态化。

create or replace procedure proc_tab_count as 
  table_count NUMBER;
  CURSOR total_tables
  IS
     SELECT table_name FROM user_tables; 
BEGIN
  FOR i IN total_tables
  LOOP
     /* Handle Exceptions */
     BEGIN
       EXECUTE IMMEDIATE 'SELECT COUNT (*)  FROM '|| i.table_name  INTO table_count;
       DBMS_OUTPUT.put_line(i.table_name||'-COUNT:'||table_count);
     EXCEPTION WHEN OTHERS 
     THEN
             DBMS_OUTPUT.put_line('Error while Querying '||i.table_name||'-Error:'||SQLERRM);
     END;
  END LOOP;
end proc_tab_count;

答案 1 :(得分:0)

我不太确定接受的答案是否有效。 user_tables是否包含owner?否则,它就在现场。

反正。另一种使用SYS_REFCURSOR的方法:

CREATE OR REPLACE PROCEDURE proc_table_count      
  CURSOR total_tables IS
  SELECT table_name 
    FROM user_tables
ORDER BY table_name; 

  table_count NUMBER;
  v_sql       VARCHAR2(100);
  v_cursor    SYS_REFCURSOR;
BEGIN
  FOR i IN total_tables
  LOOP     
     BEGIN
       v_sql := 'SELECT COUNT (*) FROM '||i.table_name;
       OPEN v_cursor FOR v_sql;
       FETCH v_cursor INTO table_count;
       CLOSE v_cursor;
       DBMS_OUTPUT.put_line(i.table_name||'-COUNT:'||table_count);
     EXCEPTION WHEN OTHERS 
     THEN
       DBMS_OUTPUT.put_line('Error while Querying '||i.table_name||'-Error:'||SQLERRM);
     END;
  END LOOP;
end proc_tab_count;