powershellでクエリを実行してみた
OracleFetch.ps1
Set-StrictMode -Version 2
# Usage: OracleFetch (OracleConnection USER PASS SID) "select 1 a,2 b,3 c from dual" | Export-Csv foo.csv -NoTypeInformation -Encoding Default
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient")
function OracleConnection {
Param($user, $pass, $sid)
$ErrorActionPreference = "Stop"
function ConnectionString {
"Data Source=${sid};User ID=${user};Password=${pass};Integrated Security=false;"
}
New-Object System.Data.OracleClient.OracleConnection(ConnectionString)
}
function OracleFetch() {
Param($conn, $sql, $BindParams = $null)
$ErrorActionPreference = "Stop"
$command = New-Object System.Data.OracleClient.OracleCommand
$command.Connection = $conn
if ($conn.State -ne "Open") {
$conn.Open()
}
$command.CommandText = $sql
if ($BindParams) {
$BindParams.Keys | % {
$param = New-Object System.Data.OracleClient.OracleParameter($_, $BindParams[$_])
[void]$command.Parameters.Add($param)
}
}
$reader = $command.ExecuteReader()
while ($reader.Read()) {
$obj = New-Object PSObject
0..($reader.FieldCount-1) | % {
$obj | Add-Member -MemberType NoteProperty -Name ($reader.GetName($_) -replace "\W", "") -Value ($reader.GetValue($_))
}
$obj
}
}
使用例:
. (Join-Path $MyInvocation.InvocationName ..\OracleFetch.ps1)
$conn = OracleConnection USER PASS SID
OracleFetch $conn "select 1 a,2 b,3 c from dual" |
Export-Csv foo.csv -NoTypeInformation -Encoding Default
OracleFetch $conn "select 1 a$#,2 日本語,3 c from dual" |
ConvertTo-Csv -NoTypeInformation
$conn.Close()
ペンディング
- 毎レコードPSObjectを作るのは効率悪そう。利用する側の好きにやらせたい。(スクリプトブロックを渡すと、$reader をそのブロックに渡してループするなど)
- 取得した $reader は、なぜかパイプラインに渡らない。(
$reader | Get-Member
が表示されない。Get-Member -InputObject $reader
はOKだった) - 以下、OracleDataAdapter を使った方法は、まだ評価中。
OracleFetch2.ps1
function OracleFetch2 {
Param($conn, $sql)
$ErrorActionPreference = "Stop"
$dataSet = New-Object System.Data.DataSet
[void](New-Object System.Data.OracleClient.OracleDataAdapter($sql, $conn)).Fill($dataSet)
$dataSet.Tables
}