HIRO's.NET

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

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

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

HIRO's.NET RSSHIRO's.NET RSS


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

HOME > PowerShell Tips > 自作関数(Oracle用) Tips メニュー

04.SQL*PLUSもどきを作る その4

 
UPDATE:2008/05/03    
 



SQL*PLUSもどきを作る その1
SQL*PLUSもどきを作る その2
SQL*PLUSもどきを作る その3
の続きです。

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

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

desc.ps1

#================================================================================================
# 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 テーブル名/ビュー名 とします。

List1


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 コマンドも使用可能で

List2

PS > desc emp | more

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

リダイレクトも可能で

List3

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

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

開発ポイントですが

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

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

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

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

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