5

SBSTという名前のスキーマがあることを考えると

このSBSTスキーマですべての空のテーブルリストを検索したいと思います。それを見つけるためのPL/SQLプロシージャはありますか。少し見つかりました。しかし、それらはスキーマ名SBSTを指定できなかったユーザーテーブルを使用していました。

私はこれを使っていました

select table_name from dba_tables where owner ='SBST'
having count(*)=0  group by table_name

上記のクエリの何が問題になっていますか?

4

4 に答える 4

8

@shareefの回答に似ていますが、一時ファイルを作成する必要がないように動的SQLを使用します。たとえば、SQL*Plusで表示される.sql必要があります-Toadについてはわかりません。dbms_outputset serveroutput on

declare
    cursor c(p_schema varchar2) is
        select 'select ''' || table_name || ''' from ' ||
            p_schema ||'.' || table_name || ' where rownum < 2 ' ||
            ' having count(*) = 0' as query
        from all_tables
        where owner = p_schema
        order by table_name;
    l_table all_tables.table_name%TYPE;
begin
    for r in c('SBST') loop
        begin
            execute immediate r.query into l_table;
        exception
            when no_data_found then continue;
        end;

        dbms_output.put_line(l_table);
    end loop;
end;
/

ここよりも使用するall_tables方が便利なdba_tablesようですので、リストされているテーブルから選択できます。他のユーザーが同じ名前のテーブルを持っている場合に備えて、スキーマもfrom句に含めました。そのため、別のユーザーとして接続している場合でもスキーマを確認できます。おそらく同義語の問題も回避できます。


具体的には、クエリの何が問題になっていますか...havinggroup by句の使い方が間違っています。ただし、SBSTにテーブルがある場合はcount (*) from dba_tablesゼロ以外である必要があるため、常にデータは返されません。したがって、having常に一致します。そうでなければ、まあ、とにかくデータがないので、having一致するものは何もありません。各テーブルにある行の数ではなく、テーブルの数を数えています。

于 2012-06-21T11:13:50.907 に答える
8

以下のクエリを実行して、データがないテーブルのリストを見つけることができます

select * from ALL_TABLES 
where owner ='SBST'
AND NUM_ROWS = 0;
于 2015-08-19T12:23:51.367 に答える
4

簡単な答えは

select 'select ''' || table_name || ''' from ' || table_name || ' 
    having count(*) = 0;' from dba_tables where owner='SBST';

説明

これを実行できます...行のないもののテーブル名を出力するだけです:sqlplusを使用していると仮定しますが、私はそれをテストするためにヒキガエルを使用し、それは非常にうまく機能しました。

spool tmp.sql
select 'select ''' || table_name || ''' from ' || table_name || ' 
having count(*) = 0;' from user_tables where owner='SBST';
spool off;

@tmp.sql 

「tmp.sql」ファイルを開くと、すべてのテーブルが表示されます。

select 'PERSONS' from PERSONS having count(*) = 0;
select 'DEPARTMENT' from DEPARTMENT having count(*)=0; 

あなたの場合、スキーマが必要であり、ユーザーSBSTに接続する場合、スキーマは上記のコードのユーザーですが、他のユーザーに接続する場合は、DBA_TABLESを使用して、所有者属性をSBSTに割り当てる必要があります

USER_TABLESはあなたが所有するテーブルですALL_TABLESは所有するテーブルであり、 DBA_TABLESへの明示的なアクセスが許可されている他のユーザーによって所有されるテーブルはデータベース内のすべてのテーブルです

このような

set echo off heading off feedback off lines 100 pages 0;

spool tmp.sql
select 'select ''' || table_name || ''' from ' || table_name || ' 
having count(*) = 0;' from dba_tables where owner='SBST';
spool off;

@tmp.sql 


3つすべてが基礎となるSYSテーブルのビューですが、結果を制限するためにUSER_ビューとALL_ビューがユーザー名/セキュリティ情報に参加しています

結果画像のアップロード

**まとめ **

このクエリを実行してください

select 'select ''' || table_name || ''' from ' || table_name || ' 
    having count(*) = 0;' from dba_tables where owner='SBST';
于 2012-06-21T09:20:15.107 に答える
1

テーブルの統計が最新の場合は、次を使用できます。

SELECT TABLE_NAME
FROM ALL_TAB_STATISTICS
WHERE (OWNER = 'ME')
  AND (NUM_ROWS = 0);
于 2016-06-03T08:20:11.220 に答える