Wednesday, April 23, 2008

自分が勤務している会社は、データベースが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;
    }
}

詳細については次回説明したいと思います。

Wednesday, April 23, 2008 8:47:35 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: