日期:2014-05-16 浏览次数:20644 次
今天在群里有人问如何查看某个用户下的所有空表,有人回答是写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 过程已成功完成。
再查看user_tables数据字典
SQL> exec dbms_stats.gather_schema_stats(user);
PL/SQL 过程已成功完成。
-------------------- ----------
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方便得多。