2

オラクル: 11g OS: Linux

解決しようとしているこの非常にトリッキーな質問がありますが、明確な答えを得ることができません... Googleで検索しました...などですが、私の要件には運がありません...

スキーマ統計は信頼できないので、dba_tables を照会したい..また、データベースの下にプロシージャや関数を作成したくない..単純な SQL で達成しようとしているだけです。

Q. 特定のスキーマのすべてのテーブルの行数をスプールし、table_name も表示する方法を教えてください。

A. スプールでカウントを簡単に表示できますが、カウントの横にあるテーブル名を取得できません..

例えば

Table_Name Count
tab1 200
tab2 500
tab3 300

以下では、カウントを取得できますが、結果の table_name 表示を把握できません...

spool runme.sql

select 'select count(*) from '|| owner || '.' || table_name || ';' 
from dba_tables
where owner = 'user1'
order by table_name;

spool off
4

1 に答える 1

2

次のような関数を使用できますが、非常に遅くなります。

create or replace
function get_rows( p_tname in varchar2 ) return number
as
    l_columnValue    number default NULL;
begin
    execute immediate
       'select count(*)
          from ' || p_tname INTO l_columnValue;

    return l_columnValue;
end;
/

select user, table_name,
       get_rows( user||'.'||table_name) cnt
  from user_tables
/

Tom Kyte のサイトのこの回答から取得したコード:

http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:1660875645686

関数呼び出しなしでも可能です:

select
table_name,
to_number(
   extractvalue(
      xmltype(
         dbms_xmlgen.getxml('select count(*) c from '||table_name))
,'/ROWSET/ROW/C')) count
from user_tables;

ここのヒントから:

http://laurentschneider.com/wordpress/2007/04/how-do-i-store-the-counts-of-all-tables.html

于 2013-06-05T14:28:58.923 に答える