自分が勤務している会社は、データベースが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)です。
#=============================================================================== # 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; } }
詳細については次回説明したいと思います。
Theme design by Jelle Druyts
Pick a theme: BlogXP business calmBlue Candid Blue dasBlog dasblogger DirectionalRedux Discreet Blog Blue Elegante essence Just Html MadsSimple Mobile Mono Movable Radio Blue Movable Radio Heat nautica022 orangeCream Portal Project84 Project84Grass Slate Sound Waves Tricoleur useit.com Voidclass2 BlogXP business calmBlue Candid Blue dasBlog dasblogger DirectionalRedux Discreet Blog Blue Elegante essence Just Html MadsSimple Mobile Mono Movable Radio Blue Movable Radio Heat nautica022 orangeCream Portal Project84 Project84Grass Slate Sound Waves Tricoleur useit.com Voidclass2
Powered by: newtelligence dasBlog 2.0.7226.0
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.
© Copyright 2009, HIRO
E-mail