HIRO's.NET

VB.NET, C#, PowerShell Tipsサイト

 VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。

 基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。

HIRO's.NET RSSHIRO's.NET RSS


PowerShellの開発でお困りのことはありませんか?
そんな悩みは当サイトで解決!!

HOME > PowerShell Tips > 自作関数(Oracle用) Tips メニュー

01.SQL*PLUSもどきを作る その1

 
UPDATE:2008/05/03    
 
<< 前のTips  次の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

#===============================================================================
# Get-OracleConnectionString: PowerShellで独自のOracle関連スクリプトを使用可能にする
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#===============================================================================

#Assemblyのロード
[void][reflection.assembly]::LoadWithPartialName("System.Data.OracleClient")

function Global:PSOracle
{
if ($args[0] -eq "-?")
{
Write-Host @"
名前:
PSOracle

概要:
PowerShellで独自のOracle関連スクリプトを使用可能にします

構文:
PSOracle

使用方法:
PS > PSOracle
ユーザー名を入力してください: USERNAME
パスワードを入力してください: PASSWORD
接続先を入力してください: OracleServer
"@ -foregroundcolor Cyan
return
}

#Oracle専用スクリプトファイルを格納しているディレクトリの設定
$OracleScriptPath = $([Environment]::GetFolderPath(`"MyDocuments`"))\WindowsPowerShell\Oracle"

#存在するパス?
if ( Test-Path $OracleScriptPath )
{
#呼び出し演算子(&)を使用して関数を登録
Get-ChildItem $OracleScriptPath -Include "*.ps1" -Recurse -Force | % { &($_.Fullname); }
}
else
{
#実行可能なスクリプトがない場合は処理終了
return
}

#ユーザーから接続先情報を取得する
$UserID = Read-Host "ユーザー名を入力してください"
$Password = Read-Host "パスワードを入力してください" -assecurestring
$DataSource = Read-Host "接続先を入力してください"

#変数の作成
Set-Variable -Scope "Global" -Name "OracleDataSource" -value $DataSource
Set-Variable -Scope "Global" -Name "OracleUserID" -Value $UserID;
Set-Variable -Scope "Global" -Name "OraclePassword" -Value $Password;
Set-Variable -Scope "Global" -Name "OracleConnInfo" -Value "$UserID@$DataSource";

$strSQL = "SELECT PRODUCT || 'Release ' || VERSION FROM product_component_version Where UPPER(PRODUCT) LIKE 'ORACLE%'"

$ConnectionString = (Get-OracleConnectionString $UserID $Password $DataSource)
$OraConn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)
$dtSet = New-Object System.Data.DataSet
$OraDa = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL, $OraConn)
[void]$OraDa.Fill($dtSet)

if ( $dtSet.Tables.Count -gt 0 )
{
Write-Host ("`n" + $dtSet.Tables[0].Rows[0][0].ToString() + " - Production`n")
}

trap [System.Data.OracleClient.OracleException]
{
Write-Error ("接続に失敗しました。")
break;
}

trap
{
Write-Error ($Error[0].Exception);
break;
}
}

使用方法ですが、コマンドラインでList1のように PSOracle[Enter]と入力します。

List1

PS > PSOracle

すると「ユーザー名「パスワード」「接続先」を聞かれるので順に入力します。(List2)
うまく接続ができると、接続先のサーバーのバージョンが表示されます。

List2

ユーザー名を入力してください: scott
パスワードを入力してください: *****
接続先を入力してください: server01

Oracle 8i Release 8.1.7.1.1 -Production

使用方法を参照するにはList3ように入力します。

List3

PS > 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 部分が処理されます。

 
 
<< 前のTips  次のTips >>