HIRO's.NET

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

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

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

HIRO's.NET RSSHIRO's.NET RSS


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

HOME > PowerShell Tips > 自作関数 Tips メニュー

05.Oracleデータベースからデータを取得してXMLへ保存する

 
UPDATE:2008/05/02    
 



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://hiros-dot.net/)
#===============================================================================
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)
}

使用方法ですが下記のようにコマンドラインで関数名を入力します。

List1

PS C:\Work> Export-OracleDataXml

つぎに、接続先、ユーザー名、パスワード、データを取得するためのselect文、取得データの保存先を聞かれるので順番に入力していきます。

下記はOracleのサンプルであるscott/tigerのemp表データをすべて取得し、結果をC:\Work\emp.xmlへ保存する例です

List2

Data Source: YourServer
User ID: scott
Password: *****
Query String: select * from emp
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ファイルへの出力を行います。