4

查看oracle数据库用户下的所有空表

 2 years ago
source link: https://blogread.cn/it/article/5240?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

查看oracle数据库用户下的所有空表

浏览:4283次  出处信息

今天在群里有人问如何查看某个用户下的所有空表,有人回答是写PL/SQL,如下

    SQL> DECLARE
  2  v_table tabs.table_name%TYPE;
  3  v_sql VARCHAR2(888);
  4  v_q NUMBER;
  5  CURSOR c1 IS
  6  SELECT table_name tn FROM tabs;
  7  TYPE c IS REF CURSOR;
  8  c2 c;
  9  BEGIN
 10  DBMS_OUTPUT.PUT_LINE('以下为空数据表的表名:');
 11  FOR r1 IN c1 LOOP
 12  v_table :=r1.tn;
 13  v_sql :='SELECT count(*) q FROM '||v_table||' where rownum = 1';
 14  OPEN c2 FOR v_sql;
 15  LOOP
 16  FETCH c2 INTO v_q;
 17  EXIT WHEN c2%NOTFOUND;
 18  IF v_q=0 THEN
 19  DBMS_OUTPUT.PUT_LINE(v_table);
 20  END IF;
 21  END LOOP;
 22  CLOSE c2;
 23  END LOOP;
 24  EXCEPTION
 25  WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error occurred');
 26  END;
 27  / 
PL/SQL 过程已成功完成。

    SQL> set serveroutput on
SQL> /
以下为空数据表的表名:
T_FILE_INFO_RAW
T_DOSSIER_INFO_RAW
T_FONDS_INFO_RAW

其实不用那么麻烦,而且表如果很多的话,执行会很慢
先收集下用户的信息

    SQL> exec dbms_stats.gather_schema_stats(user);

PL/SQL 过程已成功完成。

SQL> select table_name,num_rows from user_tables where num_rows=0;

TABLE_NAME           NUM_ROWS 
-------------------- ---------- 
T_FILE_INFO_RAW      0 
T_DOSSIER_INFO_RAW   0 
T_FONDS_INFO_RAW     0

验证是否准确

    SQL> select count(*) from T_FILE_INFO_RAW;

  COUNT(*)
----------
         0

SQL> select count(*) from T_DOSSIER_INFO_RAW;

  COUNT(*)
----------
         0

SQL> select count(*) from T_FONDS_INFO_RAW;

  COUNT(*)
----------
         0

向T_FONDS_INFO_RAW表里插入些数据,在验证下

    SQL> insert into T_FONDS_INFO_RAW (FILE_SUM) values(1111);

已创建 1 行。
SQL> insert into T_FONDS_INFO_RAW select * from T_FONDS_INFO_RAW;

已创建 1 行。

SQL> /

已创建2行。

SQL> /

已创建4行。

SQL> commit;

提交完成。
SQL> exec dbms_stats.gather_schema_stats(user);

PL/SQL 过程已成功完成。
SQL> select table_name,num_rows from user_tables;

TABLE_NAME             NUM_ROWS
-------------------- ----------
T_FILE_INFO_RAW               0
T_DOSSIER_INFO_RAW            0
T_FONDS_INFO_RAW            8
SQL> select count(*) from T_FONDS_INFO_RAW;  COUNT(*)----------         8

这种方法比起写PL/SQL要方便得多。

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK