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) = '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 得到了这个查询。

我将其作为成功编译的程序运行,但我无法查看结果,是这样吗?

我是 pl/sql 的新手,谁能解释一下 select 语句在执行立即查询后做了什么我无法理解背后的逻辑。

4

5 回答 5

1

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

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

于 2019-10-31T06:59:48.080 回答
1

尝试这个:

select TABLE_NAME, NUM_ROWS from dba_tables where owner = 'xxxxx'
于 2018-11-20T16:44:19.350 回答
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。然后再次检查。

于 2013-04-26T13:56:28.687 回答
0

行计数被插入到表名STATS_TABLE中。你需要运行一个

select *
from stats_table

运行程序后

于 2013-04-25T16:02:05.323 回答
0

好吧,user_tables 没有用户列,因此该查询无效。始终单独测试查询——您可能想要all_tablesdba_tables. 另外,您认为您需要DISTINCT对该查询进行查询吗?

尽可能使用隐式游标而不是显式游标——更少的代码、更少的编码错误和更快的速度。

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

不要用“v_”作为变量名的前缀——只需用过程或块名称命名它们。

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

查询将被构造为:

INSERT INTO STATS_TABLE
     (   TABLE_NAME
       , SCHEMA_NAME
       , RECORD_COUNT
       , CREATED
     ) 
SELECT 'MY_TABLE_NAME' , 'MY_USERNAME' , COUNT(*) , SYSDATE
FROM MY_TABLE_NAME;
于 2013-04-25T19:33:48.393 回答