fc2ブログ

(元)社内SEの徒然なる日記

powerShellからOracleを使う(DML文:INSERT、UPDATE、DELETE)

PowerShellからDML文を発行

powerShellからOracleに接続してDML文(SELECT、UPDATE、DELETE)を実行してみます。
基本的には、3つとも同じ方法で実行できます。

なお、Oracleへの接続、切断は「powerShellからOracleを使う(接続・切断)」を、抽出は「powerShellからOracle操作(抽出:SELECT文)」を参照して下さい。

サンプルコード(登録:INSERT文)

まず、登録(INSERT文)を発行するサンプルを提示します。

# OracleClientのアセンブリをロード
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient")

# OracleConnectionオブジェクトの作成
$oracleConectionString = "Data Source=TESTDB;User ID=USER01;Password=USER001;Integrated Security=false;"
$oracleConection = New-Object System.Data.OracleClient.OracleConnection($oracleConectionString)
$oracleCommand = New-Object System.Data.OracleClient.OracleCommand
$oracleCommand.Connection = $oracleConection

# データベースに接続します。
$oracleConection.Open()


# SQL(INSERT文)を設定します。
$oracleCommand.CommandText = "INSERT INTO ABCD (TESTCD, TESTID) VALUES ('0', '004')"

# SQL(INSERT文)を実行します。
[void]$oracleCommand.ExecuteNonQuery()


# DB切断&リソース解放。
$oracleCommand.Dispose()
$oracleConection.Close()
$oracleConection.Dispose()


サンプルの解説

1.SQLの設定(CommandTextプロパティ)

まず、SQL文をOracleCommandクラスのCommandTextプロパティに設定します。
ここまでは、前回紹介した抽出と同じです。

2.SQLの実行(ExecuteNonQueryメソッド)
DML文の実行は、OracleCommandクラスのExecuteNonQueryメソッドを使用します。
これによって、先ほど設定したINSERT文が実行されることになります。

このメソッドは、戻値として「影響を受ける行の数」を返却します。
INSERTは登録件数、UPDATEは更新件数、DELETEは削除件数ってことですね。

サンプルでは、値を指定してのINSERTなので結果は1固定なので、[void]を指定して戻値を受けないようにしています。

補足

ExecuteNonQueryメソッドは、実行した時点でコミットが行われます。
コミットやロールバックのタイミングを制御したければ、トランザクションを使用する必要があります。
トランザクションの使い方については、次回にサンプルを提示します。

UPDATE文

今度は、UPDATE文を実行するサンプルです。
同じようなコードを見せても仕方ないので、SQL文の設定、実行の部分だけとします。


# SQL(UPDATE文)を設定します。
$oracleCommand.CommandText = "UPDATE ABCD SET TESTCD = '1' WHERE TESTID IN ('001','003')"

# SQL(UPDATE文)を実行します。
$oracleUpdateCount = $oracleCommand.ExecuteNonQuery()

Write-Host ("更新件数 = " + $oracleUpdateCount + "件")



今度は、ExecuteNonQueryメソッドの戻値を取得して、コンソールに更新件数を表示するようにしています。

DELETE文

最後に、DELETE文を実行するサンプルです。
やりかたは、完全にUPDATEと同じです。


# SQL(DELETE文)を設定します。
$oracleCommand.CommandText = "DELETE FROM ABCD WHERE TESTID IN ('000','003','004')"

# SQL(DELETE文)を実行します。
$oracleDeleteCount = $oracleCommand.ExecuteNonQuery()

Write-Host ("削除件数 = " + $oracleDeleteCount + "件")



戻値を受ける変数の名称を、$oracleUpdateCount から $oracleDeleteCount に変えているのは、単なる趣味です。

後書き

今回はDML文を実行しましたが、ExecuteNonQueryメソッドは、正しくはSQLステートメントを実行するメソッドです。
つまり「CREATE TABLE」とか「DROP TABLE」だとかも実行できるようで、この時の戻値は、0か-1になるようです。

“ようです”というのは、実験していないからです。
というのも「PowerShellからOracleに対して、そこまでの操作をさせて良いのだろうか?」って思いがあるんですよ。
私なら、そういう操作を行わずに済むように設計を見直しますね。

まぁ、事情はいろいろあるでしょうから、一概に否定はできないのですけど...

前回:powerShellからOracle操作(抽出:SELECT文)
次回:powerShellからOracleを使う(トランザクション)
投稿記事の一覧:目次


さて、本記事中にも書いていますが、次回はトランザクションの使い方を書こうかと思います。
やりたいことは一通りできたので、PowerShellからのOracle操作シリーズは、次回で終了としようかと思います。


スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する