トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-165 全テーブルの、レコード数を数える
SQLパズル
全テーブルの、レコード数を出力する
出力結果
TABLE_NAME COUNT
---------- -----
DEPT 4
EMP 14
BONUS 0
SALGRADE 5
SQL
select
table_name,
to_number(
extractvalue(
xmltype(
dbms_xmlgen.getxml('select count(*) c from ' || table_name))
,'/ROWSET/ROW/C')) "count"
from user_tables
where table_name not Like 'BIN$%'
and (iot_type != 'IOT_OVERFLOW' or iot_type is null)
order by table_name;
解説
動的にSQLを作成しない方法です。
Viewにしとくといいかもしれませんね。
動的にSQLを作成する方法は、下記となります。
(from句で使っているtabsは、USER_TABLESのシノニムです)
declare
execSQL varchar2(200);
willOut varchar2(200);
RecordCount number(38);
begin
for rec_Work in (select TABLE_NAME
from tabs
where TABLE_NAME not Like 'BIN$%'
order by TABLE_NAME) Loop
execSQL := 'select count(*) from ' || rec_Work.TABLE_NAME;
execute immediate execSQL into RecordCount;
willOut := rec_Work.TABLE_NAME || 'の件数は';
willOut := willOut || to_number(RecordCount) || '件';
DBMS_Output.Put_Line(willOut);
end Loop;
end;
/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
US-OTN count(*) for all tables
US-OTNのXMLの達人 MichaelSさんの方法 (11g以降)
col table_name for a20
col cnt for a20
select table_name, trim(column_value) cnt from user_tables
, xmltable(('count(ora:view("' || table_name || '"))'))
order by table_name;
TABLE_NAME CNT
---------- ---
BONUS 0
DEPT 4
EMP 14
SALGRADE 5
**********************************************************************
スカラーサブクエリ方式にアレンジしたもの
col cnt for 9999
select table_name,
(select to_number(column_value)
from xmltable(('count(ora:view("' || table_name || '"))'))) as cnt
from user_tables
order by table_name;
xmlcast関数を使用したもの
select table_name,
xmlcast (xmlquery ( ('count(ora:view("' || table_name || '"))')
returning content) as int) as cnt
from user_tables;
How do I store the counts of all tables(英語)