模式中所有表的行数

时间:2013-04-25 16:00:18

标签: oracle plsql

DECLARE 
    v_owner varchar2(40); 
    v_table_name varchar2(40); 
    cursor get_tables is 
        select distinct table_name
             , user 
          from user_tables 
         where lower(user) = 'schema_name'
    ; 

BEGIN 
    OPEN get_tables; 
    LOOP
        FETCH get_tables
         INTO v_table_name
            , v_owner
            ; 
        EXIT WHEN get_tables%NOTFOUND;
        EXECUTE IMMEDIATE 
             'INSERT
                INTO STATS_TABLE
                   ( TABLE_NAME
                   , SCHEMA_NAME
                   , RECORD_COUNT
                   , CREATED
                   ) 
                     SELECT ''' 
                                || v_table_name 
                   || ''' , ''' || v_owner 
                   || ''' ,        COUNT(*)
                          ,        TO_DATE(SYSDATE,''DD-MON-YY'')
                       FROM '   || v_table_name
        ; 
    END LOOP; 
    CLOSE get_tables; 
END; 

我使用它来获取架构中所有表的行数。我从stackoverflow得到了这个查询。

我把它作为一个成功编译的程序运行但是我无法查看结果y是这样吗?

我是pl / sql的新手,任何人都可以解释在执行立即查询后select语句做了什么我无法理解背后的逻辑。

5 个答案:

答案 0 :(得分:0)

行计数将插入表名STATS_TABLE。你需要运行一个

select *
from stats_table
运行程序后

答案 1 :(得分:0)

嗯,user_tables没有用户列,因此该查询无效。始终单独测试查询 - 您可能需要all_tablesdba_tables。另外,您认为在该查询中需要DISTINCT吗?

使用隐式光标而不是显式的光标 - 更少的代码,更少的编码错误,更快。

不要将日期存储为字符类型 - 您只需插入sysdate,而不是将其表示为字符串。

不要在变量名前加“v_” - 只需用过程或块名称命名它们。

Execute Immediate构造一个执行insert into stats_table的SQL语句(为什么名称中有“table”这个词?这当然是多余的?)

查询将构建为:

INSERT INTO STATS_TABLE
     (   TABLE_NAME
       , SCHEMA_NAME
       , RECORD_COUNT
       , CREATED
     ) 
SELECT 'MY_TABLE_NAME' , 'MY_USERNAME' , COUNT(*) , TO_DATE(SYSDATE,'DD-MON-YY')
FROM MY_TABLE_NAME;

答案 2 :(得分:0)

此过程成功运行

DECLARE
  v_owner      varchar2(40);
  v_table_name varchar2(40);
  cursor get_tables is
    select distinct table_name, user
      from user_tables
     where lower(user) = 'coreown'  ;

BEGIN
  OPEN get_tables;
  LOOP
    FETCH get_tables
      INTO v_table_name, v_owner;
    EXIT WHEN get_tables%NOTFOUND;
    EXECUTE IMMEDIATE 'INSERT
                INTO STATS_TABLE
                   ( TABLE_NAME
                   , SCHEMA_NAME
                   , RECORD_COUNT
                   , CREATED
                   ) 
                     SELECT ''' || v_table_name ||
                      ''' , ''' || v_owner || ''' ,        COUNT(*)
                          ,        TO_DATE(SYSDATE,''DD-MON-YY'')
                       FROM ' || v_table_name;
  END LOOP;
  CLOSE get_tables;
END;
/

我试着结束了。

执行USE COMMIT后。保存更改的是DB。 然后再次检查。

答案 3 :(得分:0)

尝试一下:

select TABLE_NAME, NUM_ROWS from dba_tables where owner = 'xxxxx'

答案 4 :(得分:0)

您可以通过以下方式简单地获取表的行数:

select owner, table_name, nvl(num_rows,-1) 
from all_tables 
order by nvl(num_rows,-1) desc

https://livesql.oracle.com/apex/livesql/file/content_EPJLBHYMPOPAGL9PQAV7XH14Q.html