查看oracle数据库用户下的所有空表
Sep202011
今天在群里有人问如何查看某个用户下的所有空表,有人回答是写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要方便得多。