Monday, April 28, 2008

この記事は

SQL*PLUSもどきを作る その1(PowerShell Tips)
SQL*PLUSもどきを作る その1の説明(PowerShell Tips)
SQL*PLUSもどきを作る その2(PowerShell Tips)
SQL*PLUSもどきを作る その3(PowerShell Tips) 

の続きです。

今回はSQL*PLUSのdescコマンドです。

describeコマンドを表現する関数を下記のように作ってみました。

#================================================================================================
# desc: Oracleのdescコマンド
#
# UPDATE: 2008-04-28    Ver.1.0.0
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#================================================================================================
function global:desc ([string]$TABLE_NAME) {
    $TBL = $TABLE_NAME.ToUpper()
    
    #descコマンドを実現させるためのSQL文作成
    $QueryString = "SELECT "
    $QueryString += "COLUMN_ID,"
    $QueryString += "COLUMN_NAME,"
    $QueryString += "DECODE(NULLABLE,'N','NOT NULL') NULLABLE,"
    $QueryString += "DATA_TYPE || '('  || "
    $QueryString += "DECODE(DATA_PRECISION, NULL, TO_CHAR(DATA_LENGTH),"
    $QueryString += "DECODE(DATA_SCALE,0,"
    $QueryString += "TO_CHAR(DATA_PRECISION),"
    $QueryString += "TO_CHAR(DATA_PRECISION) || ',' || TO_CHAR(DATA_SCALE))) || ')' DATATYPE "
    $QueryString += "FROM "
    $QueryString += "ALL_TAB_COLUMNS WHERE TABLE_NAME = '$TBL' ORDER BY COLUMN_ID"

    #DataSetに取得する
    $dtSet = (Execute-QueryString $QueryString)
    
    if ( $dtSet.Tables.Count -gt 0 )
    {
        #format-tableコマンドレットでデータを表示
        $dtSet.Tables[0].Rows | format-table
    }
}

使用方法はSQL*PLUSのdescコマンドと一緒で desc テーブル名/ビュー名 とします。

PS > desc emp

                    COLUMN_ID COLUMN_NAME   NULLABLE          DATATYPE
                    --------- -----------   --------          --------
                            1 EMPNO         NOT NULL          NUMBER(4)
                            2 ENAME                           VARCHAR2(10)
                            3 JOB                             VARCHAR2(9)
                            4 MGR                             NUMBER(4)
                            5 HIREDATE                        DATE(7)
                            6 SAL                             NUMBER(7,2)
                            7 COMM                            NUMBER(7,2)
                            8 DEPTNO                          NUMBER(2)

一応 More コマンドも使用可能で

PS > desc emp | more

と入力して1ページずつの表示も可能です。

リダイレクトも可能で

PS > desc emp > C:\Work\emp.txt

のようにすると 出力結果をC:\Work\emp.txtに作成します。

開発ポイントですが

descコマンドを実現するために、情報を ALL_TAB_COLUMNS から取得する。

結果の出力にformat-tableコマンドレットを使用する。

といったところでしょうか。出力をどうするかかなり悩みました。DataReaderで1行ずつ取得するとテキストの整形(列ごとにきれいに表示させる)処理を書く必要が出てくるためどうしたものかと考えていましたが、パイプでformat-tableコマンドレットへデータを渡したところきれいに表示されました。

見ていただけばわかるように、データセットにあるテーブルの行を丸投げしているだけです。

PowerShellってこういうところが非常によくできていますね。改めてすばらしいツールだと思いました。

Monday, April 28, 2008 10:06:36 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: