【SQL, Oracle】ユーザが所有するテーブル一覧とレコード件数を取得するPL/SQL

チップス

汎用的に使えるテーブル一覧と件数を表示するSQL文を書いてみた。

【SQL文】

SET SERVEROUTPUT ON
DECLARE
CURSOR C1 IS
 SELECT TABLE_NAME
 FROM USER_TABLES
 ORDER BY TABLE_NAME;
 cnt integer;
BEGIN
 FOR C2 IN C1 LOOP
 EXECUTE IMMEDIATE 'select count(1) from ' || C2.TABLE_NAME INTO cnt;
 DBMS_OUTPUT.PUT_LINE( C2.TABLE_NAME || ',' || cnt);
 END LOOP;
END;

【説明】
※SELECT結果の文字列(ここではテーブル名)を使ってSELECT結果を取得したいので、動的SQL(EXECUTE IMMEDIATE)を使用した。動的SQLを使わざるをえなくなり、プロシージャ化したが他にスマートなやり方があれば知りたい。
※通常のSQLではなくPL/SQLつまりプロシージャ化しているDECLEAREの下が定義部で変数を定義するセクションBEGINが処理でそれぞれ意味が違うらしい。
※カーソルを使ってFORで繰り返してCOUNTを使った。
※SELECT文の結果は、SELECT文の後に「INTO <変数>」と書くことが可能。

【個人的な感想】
※本当は処理の実行前と実行後でDBの内容のdiff(コンペア)をとりたいが、それは別で行うのでとりあえずCSV形式にした。
※本当はテキストではなく表形式で結果を貰えたほうが便利だと思っているが調べる気力が尽きた。

【応用編】
※Oracle意外のOSSのRDBであればGroup byやjoinを使ってできそうな気がしたしその方が処理スピードが早そう。

チップス
スポンサーリンク
シェアする
gomiryoをフォローする
ごみぶろぐ

コメント

タイトルとURLをコピーしました