なか日記

一度きりの人生、楽しく生きよう。

OracleとPowerShellのパイプラインとヒアドキュメントがステキ!

日本語が不自由なんじゃないと思われそうなタイトルですが、気にしないでください。

id:mondayboyさんの「PowerShell ヒアドキュメントでsqlplusを使用する - mondayboy's diary」で、こんなんできるんやーって関心したのでメモっておきます。

パイプライン便利ね

パイプライン使って、こんな書き方ができるんですね。

コマンドプロンプト(バッチファイル)の場合

echo select sysdate from dual; | sqlplus scott/tiger@orcl

exitしてないけど、sqlを実行後、勝手にexitしてコマンドプロンプトに制御が戻ってきます。

ただ、毎回Oracleへの接続が行われますので、複数のSQLを実行しようとするとその時間がかなりネックになります。

PowerShellの場合

$sql="select sysdate from dual;"
$sql | sqlplus scott/tiger@orcl

exitがいらないのはコマンドプロンプトと同じです。

PowerSellで嬉しいのはid:mondayboyさんのブログに書かれていたヒアドキュメントが使えるっていうところ。これを使えば複数のSQLをまとめて実行できます。これならOraleへの接続は1回で済むので効率的ですね。

$sql=@"
create table hoge (id number(5));
insert into hoge values (1);
insert into hoge values (2);
insert into hoge values (3);
commit
"@
$sql | sqlplus scott/tiger@orcl

使い所

これの使い所としていろいろ考えてみましたが、外部でSQLを組み立てて実行したい場合というのが一番考えられる場面かなぁと思います。

動的なSQLを発行する

動的なSQLを発行するのって結構面倒くさいよなぁと思ったのですが、調べてみたら結構簡単でしたorz

EXECUTE IMMEDIATE 'create table hoge (id number(5))'

やり方は色々あるみたいなので、下記ブログ等参照してもらえればと思います。

外部から引数を渡す

バッチファイルやPowerShellの変数(環境変数を含む)を使ったSQLを発行するのって、結構面倒くさいよなぁと思いましたが、これもそれほど面倒じゃなかったり…

SQLファイル

insert into hoge values (&1);
commit;
exit

コマンド

> sqlplus scott/tiger@orcl @param.sql "100"

この場合、SQL文が別ファイルに別れるのでちょっと嫌な感じ。こんな時にPowerShell使えばシンプルに書けそうです。

$hoge=100
$sql=@"
insert into hoge values ($hoge);
commit
"@
$sql | sqlplus scott/tiger@orcl

その他にも

コントロールが完全にPowerShell側にありますから、条件分岐で発行するSQLを変えるとか、何でもできそうですね。

id:mondayboyさんありがとうございます!