Oracle DB の全テーブルのレコード数と最終更新日時を求めてみる PL/SQL 版
前回の記事と全く同じことを PL/SQL でやってみる。
これも TableList.sql
とでも名付けて Start
で実行してやればデータが CSV 形式で保存できる。
Set feedback off
Set serverout on
Set trimspool on
Spool C:\TableList.csv
DECLARE
CURSOR table_names IS
SELECT
TABLE_NAME
FROM
USER_TABLES
ORDER BY
TABLE_NAME;
table_name VARCHAR2(100);
table_count VARCHAR2(10);
table_updated_at VARCHAR2(19);
sql_count VARCHAR2(1000);
sql_updated_at VARCHAR2(1000);
num NUMBER := 1;
BEGIN
OPEN table_names;
FETCH table_names INTO table_name;
IF table_names%NOTFOUND THEN
CLOSE table_names;
RAISE NO_DATA_FOUND;
END IF;
DBMS_OUTPUT.PUT_LINE('NO, TABLE_NAME, COUNT, UPDATED_AT');
LOOP
BEGIN
sql_count := 'SELECT COUNT(*) FROM ' || table_name;
EXECUTE IMMEDIATE sql_count INTO table_count;
sql_updated_at := 'SELECT DECODE(MAX(updated_at), NULL, ''-'', TO_CHAR(MAX(updated_at), ''YYYY-MM-DD HH24:MI:SS'')) FROM ' || table_name;
EXECUTE IMMEDIATE sql_updated_at INTO table_updated_at;
DBMS_OUTPUT.PUT_LINE(num || ',' || table_name || ',' || table_count || ',' || table_updated_at)
num := num + 1;
FETCH table_names INTO table_name;
EXIT WHEN table_names%NOTFOUND
END;
END LOOP;
CLOSE table_names;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No Data Found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception');
IF table_names%ISOPEN THEN
CLOSE table_names;
END IF;
END;
/
Spool Off
PL/SQL の勉強のために単純に PL/SQL へ移植しただけなので特筆することなし。