Windows PowerShellからOracleへアクセスし、取得したデータをXMLファイルへ落とし込む関数を作ってみました。
Export-OracleDataXml.ps1
#===============================================================================
# Export-OracleDataXml: データを取得してXMLファイルへ保存する(Oracle)
#
# 使用例
# PS > Export-OracleDataXml
# PS > DataSource: データソース名
# PS > User ID: ユーザーID
# PS > Password: パスワード
# PS > Query String: クエリ文字列
# PS > Save Path: 保存先を指定
#
# copyright HIRO's.NET(http://hiro.wankuma.com/)
#===============================================================================
function global:Export-OracleDataXml
{
#===== 必要情報をユーザーから取得する =====
$DataSource = Read-Host "Data Source"
$UserID = Read-Host "User ID"
$Password = Read-Host "Password" -assecurestring
$QueryString = Read-Host "Query String"
$SavePath = Read-Host "Save Path"
#保存先パスに"\"が含まれていない場合(つまりファイル名のみが指定されていた場合)は
#絶対パスにする(ファイル名のみが指定された場合、カレントディレクトリに保存するため)
if ( $SavePath.IndexOf("\") -eq -1 )
{
$SavePath = $(Join-Path $(Get-Location).Path $SavePath)
}
#===== newpopsさんのblog参照 http://d.hatena.ne.jp/newpops/20050923/p1 =====
#SecureStringからパスワード文字列を取得する
$ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
$pass = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
#===== Oracleからのデータ取得とファイルへの保存 =====
[reflection.assembly]::LoadWithPartialName("System.Data.OracleClient")
$ConnectionString = "Data Source=" + $DataSource + ";User ID=" + $UserID + ";Password=" + $Pass + ";Integrated Security=no;"
$OraConn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)
$dtSet = New-Object System.Data.DataSet
$OraDa = New-Object System.Data.OracleClient.OracleDataAdapter($QueryString, $OraConn)
$OraDa.Fill($dtSet)
$dtSet.WriteXml($SavePath)
}
最初に使用方法ですがコンソールウィンドウに
PS C:\Work> Export-OracleDataXml
と入力します。
つぎに、接続先、ユーザー名、パスワード、データを取得するためのselect文、取得データの保存先を聞かれるので順番に入力していきます。
下記はOracleのサンプルであるscott/tigerのemp表データをすべて取得し、結果をC:\Work\emp.xmlへ保存する例です
PS C:\Work> Data Source: YourServer
PS C:\Work> User ID: scott
PS C:\Work> Password: *****
PS C:\Work> Query String: select * from emp
PS C:\Work> SavePath: C:\Work\emp.xml
===== ポイント =====
今回の関数は対話式にしてみました。
1)Read-Hostコマンドレットを使用して、ユーザーからの入力を取得して、変数へ代入しています。
Read-Hostコマンドレットは
$a = Read-Host "メッセージ"
のように使用します。
この場合は、コンソールに "メッセージ:" と表示され
ユーザーが[Enter]を押すまでの文字列を$aに代入します。
2)SecureStringでパスワードを*で表示する
Read-Hostコマンドレットのパラメータに -assecurestring というのがあるんですが、このパラメータを使用すると、ユーザーが入力する文字列が * で表示されます。
-assecurestringを使用すると、変数の型がSystem.Security.SecureStringになります。
System.Security.SecureString型のデータはこのままでは使用できません。
このままでif文などで比較しても正しい結果は得られないので、解読してString型に変換する必要があります。
newpopsさんのblogにその方法が書かれてありましたので参考にさせていただきました。(http://d.hatena.ne.jp/newpops/20050923/p1)
3)System.Data.OracleClientの読み込み
PowerShell起動時はSystem.Data.OracleClientは読み込まれていません。
[reflection.assembly]::LoadWithPartialName で System.Data.OracleClientをロードし、OracleClientクラスを使用可能にしています。
4) DataSetを作成する
取得したデータをXmlへ出力するのに、DataSetのWriteXmlメソッドを使用することにしました。
New-Obejctコマンドレットを使用してDatSetを作成しています。
5)DataAdapterを作成する
これもNew-Objetctコマンドレットを使用しています。
6)XMLへ出力する
4)で述べたとおり、DataSetのWriteXmlメソッドを使用してXMLファイルへの出力を行います。