Oracle DB の全テーブルのレコード数を求める SQL
Oracle には「データディクショナリ」と呼ばれる参照表があり、ユーザやテーブルに関する色々を SQL で検索できる。
例えば SELECT TABLE_NAME FROM USER_TABLES;
とすると、Oracle DB にログインしているユーザスキーマの中にある全テーブル名の一覧を SQL で取得できる。今回はこの SQL を拡張して、ユーザが持つ全テーブルのレコード数を求めてみる。
SELECT
TABLE_NAME,
TO_NUMBER(
EXTRACTVALUE(
XMLTYPE(
DBMS_XMLGEN.GETXML(
'SELECT COUNT(*) C FROM ' || TABLE_NAME
)
)
, '/ROWSET/ROW/C'
)
) CNT
FROM
USER_TABLES
WHERE
TABLE_NAME NOT LIKE 'BIN$%'
ORDER BY
TABLE_NAME;
XML で SQL 文の結果を受け取っている。そのためか実行には若干時間がかかる。WHERE 句ではリサイクル・ビンのテーブルを除外するようにしている。