SQL で USER_TABLES を参照してテーブルの一覧を取得してそのテーブル名で統計情報更新するSQLを組み立てて順に実行する。 とか、
同じくSQL で USER_INDEXES を参照してインデックスの一覧を取得してインデックスを再構築するSQL を組み立てて順に実行する。
といったことを簡単に実行する手順(SQL)です。
【操作手順】
- SELECT 文でSQL を組み立て、カーソルにしてEXECで順次実行していきます。
例としてインデックスの一覧を取得してインデックスを再構築するSQLを実行します。
DECLARE
--SQLを作成するカーソル定義
CURSOR CUR_COMMAND_LIST IS
SELECT 'ALTER INDEX ' || INDEX_NAME || ' REBUILD' AS cmd
FROM USER_INDEXES
--レコード変数を定義
REC_COMMAND_LIST CUR_COMMAND_LIST%ROWTYPE;
BEGIN
--カーソルオープン
OPEN CUR_COMMAND_LIST;
LOOP
--1行フェッチする。
FETCH CUR_COMMAND_LIST INTO REC_COMMAND_LIST;
--データが存在しない場合は終了
EXIT WHEN CUR_COMMAND_LIST%NOTFOUND;
--SQLを実行
EXECUTE IMMEDIATE REC_COMMAND_LIST.cmd;
END LOOP;
--カーソルを閉じる
CLOSE CUR_COMMAND_LIST;
END;
/
- 上記のコマンドをバッチ実行する方法
上記のコマンドの最後に「exit」を付加し、「command.sql」というファイル名で保存します。
※「exit」がないとSQL*Plus でコマンドの待ち状態になるのでいつまでたっても終了しません。
※ファイル名は環境に合わせて設定してください。
DECLARE
--SQLを作成するカーソル定義
CURSOR CUR_COMMAND_LIST IS
SELECT 'ALTER INDEX ' || INDEX_NAME || ' REBUILD' AS cmd
FROM USER_INDEXES
--レコード変数を定義
REC_COMMAND_LIST CUR_COMMAND_LIST%ROWTYPE;
BEGIN
--カーソルオープン
OPEN CUR_COMMAND_LIST;
LOOP
--1行フェッチする。
FETCH CUR_COMMAND_LIST INTO REC_COMMAND_LIST;
--データが存在しない場合は終了
EXIT WHEN CUR_COMMAND_LIST%NOTFOUND;
--SQLを実行
EXECUTE IMMEDIATE REC_COMMAND_LIST.cmd;
END LOOP;
--カーソルを閉じる
CLOSE CUR_COMMAND_LIST;
END;
/
exit
上記のSQLファイルを実行するバッチファイル(ファイル名:exec.bat)を作成します。
ダブルクリックで実行したり、タスクなどで定期的に実行することができます。
SQLPLUS ユーザー名/パスワード@接続文字列 @ファイルのフルパス
例:上記で作成した「command.sql」が「c:\cmd」フォルダーにある場合
SQLPLUS USER01/PASS01@ORCL @c:\cmd\command.sql
- 動的に実行するSQLの例
--インデックスの一覧を取得し、インデックスの再構築を順に実行する
CURSOR CUR_COMMAND_LIST IS
SELECT 'ALTER INDEX ' || INDEX_NAME || ' REBUILD' AS cmd
FROM USER_INDEXES
--テーブルの一覧を取得し、統計情報の更新を順に実行する
CURSOR CUR_COMMAND_LIST IS
SELECT ' ANALYZE TABLE ' || TABLE_NAME || ' COMPUTE STATISTICS;' AS cmd
FROM USER_TABLES
--スキーマを指定してセッションの一覧を取得し、順に強制終了する
CURSOR CUR_COMMAND_LIST IS
SELECT 'ALTER SYSTEM KILL SESSION ''' || SID || ',' || SERIAL# || ''' IMMEDIATE' AS cmd
FROM V$SESSION
WHERE SCHEMANAME = '<スキーマ名>';