汎用的に使えるテーブル一覧と件数を表示する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を使ってできそうな気がしたしその方が処理スピードが早そう。
コメント