VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。
基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。
自分が勤務している会社は、データベースがOracleなのでSQL*PLUSをよく使用します。
SQL*PLUSってCMD.EXEやPowerShellからでも
C:\Work> sqlplus
って入力すれば使用できますよね?
で、最近はCMD.EXEよりはPowerShellを使用しているので、PowerShellからSQL*PLUSを呼び出しています。
sqlplus[Enter]と入力して sqlplusを使用するとPowerShellのコマンドレットが使えなくなります。(sqlplusを起動させているので当然なのですが)
自分は欲張りなので、SQL*PLUSを起動しつつもPowerShellも使いたいと思いました。そうすれば取得結果をリダイレクトしてファイルに落としたり、Window Formへデータ渡してみたりといろいろと応用が利きそうです。
ということで、PowerShellで動くSQL*PLUSもどきを作ってみたいと思います。
とはいっても、descコマンドと、SQLの実行ができることだけを目標にしています。
今回は、SQL*PLUSもどきの入り口部分を作ってみました。
関数名はPSOracle(PowerShell で Oracleの略)です。
実行すると、ユーザー名、パスワード、接続先を聞かれるので、順に入力すると、
1.PSOracle用のその他のライブラリ(関数ファイル)をPowerShellへ登録
2. グローバル変数へ接続先情報の登録
3.実際に接続してOracleサーバーのバージョンの表示を行います
以下が関数本体(PSOracle.ps1)です。
PSOracle.ps1#=============================================================================== |
使用方法ですが、コマンドラインでList1のように PSOracle[Enter]と入力します。
List1PS > PSOracle |
すると「ユーザー名「パスワード」「接続先」を聞かれるので順に入力します。(List2)
うまく接続ができると、接続先のサーバーのバージョンが表示されます。
List2ユーザー名を入力してください: scott |
使用方法を参照するにはList3ように入力します。
List3PS > PSOracle -? |
ポイント
1.PSOracle用ライブラリの読み込み
PSOracle関数を呼び出すと、最初にMy Documents\WindowsPowerShell\Oracle フォルダ内にある*.ps1ファイルを読み込み、PowerShellに関数を登録します。
こうすることで、PSOracleが実行されたときに、必要な関数を登録します。
SQL*PLUSもどきで必要な関数を*.ps1ファイル化して、このフォルダに置くことで、PSOracleを拡張していくことを可能にしてます。
動的にPowerShellに関数を登録するには呼び出し演算子(&)を使用して登録しています。
2.ユーザーからの情報取得
ユーザーから情報を取得するにはRead-Hostコマンドレットを使用します。
パスワードに関しては、入力した文字が丸見えでは困るので -assecurestring パラメータを付加しています。こうすることで入力した文字は*で表示されます。
3.グローバル変数の作成
PSOracleの関数を抜けてしまうと、ユーザーから取得した接続先情報が失われてしまうのでグローバル変数に登録します。
グローバル変数の作成は Set-Variableコマンドレットを使用して -Scopeパラメータで"Global"を使用します。
ここで作成した変数に、ユーザーから取得した情報をセットすることで、関数を抜けた後でも再利用できるようにしています。
4.Oracleへ接続する
Oracleへの接続はOracleClientを使用しています。
PSOracleが読み込まれたときに、System.Data.OracleClientをロードして使用可能にしています。
接続文字列は、自作関数 Get-OracleConnectionString(次回説明予定)で作成しています。この接続情報を元にOracleへ接続してサーバ情報を取得するSQL文を実行しデータセットへ結果を取得します。
5.エラートラップ
接続時のエラートラップは trap {} で行います。
これはVB.NETやC#でいうところのcatchの部分に相当します。 VB.NETやC#を扱っているとtry部分がないのが気になるところです。 関数内で例外が発生すると trap 部分が処理されます。