PowerShell Oracleデータベースを操作しろ!#2
Windows PowerShellポケットリファレンス改訂新版 3.0/2.0/1.0対応 (Pocket reference) [ 牟田口大介 ]
|
Oracleデータベース操作についての記事、第2弾である。
▼前回の記事はこちら。
PowerShell Oracleデータベースを操作しろ!#1 - 業務改善!Windows PowerShell入門
今回はOracleデータベース操作における例外処理について触れたい。
第1弾ではとりあえず、「接続、データをぶっこ抜く」ということが主なテーマであった。そのため、最後にまとめたソースも例外(エラー)処理を全くかましていない状態である。
よって、今回は第1弾のソースに例外処理をかましていきたい。
例外処理とはどんなんや?
例外処理とは、プログラムが異常な動作をする場合にやる処理のことである。
そのため事前にエラーが起きそうな処理を想定して、何らかの処理を仕込んでおくことをすれば良いわけである。
今回の例外処理では、Try~Catch~Finallyステートメントを用いた構造化エラー処理を使用する。
構文と流れはこうだゼ!
Try{
エラーが起きそうな処理
}Catch[エラーの型]{
エラー時にやってあげる処理
}Finally{
エラー有無によらず必ずやる処理
}
1.Tryブロックでエラー発生!
2.即座にTryブロックを抜けろ!
3.Catchブロックの処理に行け!
4.Finallyブロックの処理をやって終わり。
※エラーの型、Finallyブロックは省略可能。
どこに例外処理をかますんや?!
最低限のことだけを想定すると、例外処理かまさねばならんのは、以下の2点である。
・データベース接続
・SQL実行
これを踏まえ、第1弾のソースを以下のように改修した。
#アセンブリのロード
Add-Type -AssemblyName System.Data.OracleClient
#////接続文字列の作成////
#Data Source:接続先
#User ID :ユーザーID
#Password :パスワード
#Integrated Security:Windowsアカウントの資格情報を認証に使うかどうか
$ConnectionString = "Data Source=orcl;User ID=system;Password=0000;Integrated Security=false;"
#OracleConnectionオブジェクトの作成
$OraCon = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)
#Oracle接続確認
Try{
$OraCon.Open()
$OraCon.Close()
}Catch{
Write-Host "DB接続エラー!" -ForegroundColor Red
$Error[0].Exception.Message
Break
}
#データセットの作成
$dtSet = New-Object System.Data.DataSet
#データテーブルの作成
$dtSet.Tables.Add("部門")
$dtSet.Tables.Add("従業員")
#SQL文の作成
$strSQL = @()
$strSQL += "SELECT * FROM SCOTT.DEPT"
$strSQL += @"
SELECT EMPNO,ENAME,DEPTNO,JOB FROM
SCOTT.EMP
WHERE
DEPTNO IN(10,30)
ORDER BY
DEPTNO ASC
"@
#データセットの全テーブルへの処理
$i = 0
ForEach($tb in $dtSet.Tables){
#テーブル名を表示
Write-Host "▼ $i 番目のテーブル" -ForegroundColor Yellow
Write-Host $tb.TableName
#OracleDataAdapterクラスを使用して、データの取得
$data = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL[$i], $OraCon)
Try{
#データセットのテーブルに取得データを格納
[void]$data.Fill($tb)
}Catch{
Write-Host "DB接続、またはSQLエラー!" -ForegroundColor Red
$Error[0].Exception.Message
$i++
Continue
}
#テーブルのデータを表示
$tb | Format-Table
$i++
}
「Oracle接続確認」のときにかます
ソースの前半部分で、Oracle接続確認をしている。
ここにまずは例外処理をかましている。
#Oracle接続確認
Try{
$OraCon.Open()
$OraCon.Close()
}Catch{
Write-Host "DB接続エラー!" -ForegroundColor Red
$Error[0].Exception.Message
Break
}
流れとしては、Tryブロックで接続成功したら、そのまま一旦接続を解除している。
もし、接続に失敗したら、Catchブロックに飛んでエラーの通知をした後、Breakキーワードを使って、以降の処理を実施しないようにしている。
(※成功時に何故、一旦接続解除をしているかはこの後すぐ説明する。)
さて、今回のOracelデータベース操作で大活躍しているOracleClient名前空間のOracleDataAdapterクラスだが、これは非接続型のデータベース接続方法である。
イメージは下図の通りだ。
<非接続型とは>
「データベース接続、データ抽出、データセット保持、データベース接続解除」をまとめてやってくれる。
さて、このタイミングであるが、ソースの後半にあるFillメソッド実行時である。
明示的にOpen、Closeをしなくても良いのである。
楽だ。非常にありがたい!
だが、まとめて処理する前に接続確認だけはしておきたいゼ!
これが、前半に例外処理をかました理由である。
<接続型とは>
データベースの接続を確立した後、明示的に切断するまで、接続を維持し続ける。
面倒くさいが自分でOpen、Closeをやらないといけない。
以下は、まちがった接続文字列でOracleデータベースに接続を試みた場合の例外処理である。
「データセットの全テーブルへの処理」のときにかます
ここで例外処理をかます目的は、SQL文が間違っていた場合のフォローが主目的である。 前半で接続確認は一旦とれているので。
しかし、此処に来て接続できないことも想定されるので、プロンプトに「DB接続、またはSQLエラー!」と表示をするようにした。
どっちのエラーかはメッセージを見れば一目瞭然だからだ。
以下は、Oracleデータベースに存在しないテーブルにSELECT実行しようとした場合の実行結果である。
0番目のテーブルで失敗したら、しっかり例外捕捉したあと、Continueキーワードを使って、Try~Catchブロック以降にあるテーブルデータ表示をしない。そして、1番目のテーブル取得をするため次のループ処理をしたのが分かる。
$Error[0]について
Catchブロックに仕込んである$Error[0]だが、これが何かを説明しておく。
こいつは自動変数であり、発生したエラー内容が格納されているゼ!
配列になっていて、直近のエラーは要素番号0で取得可能だ。
常に要素番号0に最新のエラーがいらっしゃいます!
自動変数$ErrorのException型にいるMessageというメンバでエラーメッセージが取得できる。
自動変数についてはこれまでの記事で何度も登場しているが、便利このうえない野郎である。
次回、第3弾は取得したデータセットのテーブルをファイルに出力する方法や、PowerShellのコマンドレットとの連携によるテーブルの二次加工について触れる予定である。
PowerShell、イエーイ!
ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。
▼ロリポップ!レンタルサーバーはこちら