#twitterでつぶやいたら案外好評だったので、blogでも紹介。
PL/SQLのプログラミングを行っている場合、「ファイルを編集→SQL*Plusでコンパイル」という流れを繰り返し繰り返し行うことになりますが、案外面倒ですよね?
そこで私は、秀丸上からSQLの実行を行い、その結果を秀丸上に書き戻すマクロを作成して使っていました。このマクロを実行すると、対象となるOracle接続をリストから選択して実行できます。
私はこのマクロと組み合わせて、テストデータ作成用SQL、パッケージコンパイル用SQL、テスト用SQLを作成して繰り返し繰り返しTDDっぽくPL/SQLの開発を行っています。
ハードコピー
実行時
実行結果
※「9:その他」選択時は、接続文字列を手入力できます。
ソース
// =============================================== //
// SQL*PlusによるSQL実行マクロ
// 作成者 :まさる
// http://blogs.wankuma.com/masaru/
// 作成日 :2009/08/04
// Version :1.0
//
// [注意書き]
// 自由に使ってもらってもかまいませんが、自己責任でお願いします。
// 変なことになっても責任は負いかねます<(__)>
// なお、てきとーに改変してもらっても構いません。
// =============================================== //
// 変数初期設定
#menuArrayCnt = 0;
// ファイルが更新されているかチェック
if ( filename2 == "" || updated ) {
// ファイルのセーブ
save;
// 保存処理結果判断
if ( result == false ) {
endmacro;
}
}
// メニュー配列項目設定
// 以下の形式で必要な行を追加してください
// call SetMenuArray str(#menuArrayCnt+1) + " : (メニューに表示する文字列)", "user/pass@tnsname";
call SetMenuArray str(#menuArrayCnt+1) + " : SCOTT", "SCOTT/BASE@ORCL";
call SetMenuArray "9 : その他", "";
// メニューから選択
menuarray $menuArray[0], #menuArrayCnt;
// 選択されたメニューを判断
if ( result == 0 ) {
// 選択されなかったらマクロ終了
endmacro;
} else if ( $menuArray[1][result - 1] != "" ) {
// 選択されたメニューのスキーマの接続文字列を設定
$connectionString = $menuArray[1][result - 1];
} else {
// 接続文字列を入力させる
$connectionString = input("接続文字列を入力してください。","user/pass@tnsname");
// 入力されなかったらマクロ終了
if ( $connectionString == "" ) {
endmacro;
}
}
// 実行文字列生成
$runstr = "sqlplus " + $connectionString + " @\"" + filename2 + "\"";
// 実行
run $runstr;
// マクロ終了
endmacro;
// ----------------------------------------------
// メニュー用配列設定サブルーチン
// 引数:
// $$1:メニュー表示テキスト
// $$2:接続文字列
// ----------------------------------------------
SetMenuArray:
$menuArray[0][#menuArrayCnt] = $$1;
$menuArray[1][#menuArrayCnt] = $$2;
#menuArrayCnt = #menuArrayCnt + 1;
return;
ダウンロード
おまけ
テスト実行用SQLのひな型
無名ブロックを使い、テストコードを実行します。
SET SERVEROUTPUT ON -- DMBM_OUTPUT.PUT_LINEの結果を標準出力に出力する
SET LINESIZE 1000 -- 1行の長さを1,000バイトにする
DECLARE
-- テストで使用する変数等定義
BEGIN
DBMS_OUTPUT.PUT_LINE('■処理開始');
-- テスト処理
DBMS_OUTPUT.PUT_LINE('■正常終了');
COMMIT;
EXCEPTION
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('■異常終了');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
最終行の"/"の後には改行を入れてください。そうしないとSQL*Plusで無名ブロックが実行されません。