【System.Data.OracleClient】PL/SQL の一時実行から結果の値を取得する

  概要



特別な事ではありませんが、OracleClient の ExecuteNonQuery メソッドでは、PL/SQL を実行する事ができます。
その時に使用される変数部分には、:( コロン ) を使用して呼び出し側の言語の変数をバイントできるようになっています。

サーバー側のカーソルを取得して使用する

ですから、以下のような PL/SQL テキストを実行して、INSERT によって更新された内容を実行直後に取得可能です

1) シーケンスによってセットされた値
2) 関数によってセットされた値
3) ROWID の値

一時プロシージャテスト.sql
  
BEGIN

	INSERT INTO 採番テストテーブル
		( 伝票番号, 更新日 )
	VALUES
		(伝票番号.NEXTVAL,sysdate)
	RETURNING ROWID, 伝票番号, 更新日 INTO :RET_01,:RET_02,:RET_03;

END;
  

RETURNING に関しては、こちら( Oracle ドキュメント ) を参照して下さい

※ System.Data.OracleClient で PLSQL を実行する場合、改行コードは CRLF では無く LF にする必要があるようです

また、ExecuteOracleNonQuery を使用すると、メソッドレベルで ROWID だけは取得できます。



  System.Data.OracleClient をそのまま使用したコード



  
' 接続文字列作成
Dim myConnectString As String = _
   "Server=localhost/xe;" + _
   "User ID=ora01;" + _
   "Password=ora01;"

' 接続オブジェクト作成
Dim myCon As New OracleConnection()
' 接続文字列セット
myCon.ConnectionString = myConnectString

' コマンドオブジェクト作成
Dim myCommand As New OracleCommand()
Try
	' 接続
	myCon.Open()
	' 接続とコマンドオブジェクトを関連付ける
	myCommand.Connection = myCon
Catch ex As Exception
	Console.WriteLine("接続文字列=" + myConnectString)
	Console.WriteLine(ex.Message)
	Return
End Try

' 一時的に実行される PL/SQL コードを取得
Dim path As String = "..\..\テキストファイル\一時プロシージャテスト.sql"
Dim myReader As New System.IO.StreamReader(path, System.Text.Encoding.Default)
Dim myTempPlsqlCode As String = myReader.ReadToEnd()
myReader.Close()
' CRLF を LF に変更
myTempPlsqlCode = myTempPlsqlCode.Replace(ControlChars.CrLf, ControlChars.Lf)

' コマンドのパラメータをクリア
myCommand.Parameters.Clear()
' コマンドのタイプをテキストに設定
myCommand.CommandType = CommandType.Text
' PL/SQL を設定
myCommand.CommandText = myTempPlsqlCode

' ROWID を取得するパラメータを作成
Dim RET_01 As New OracleParameter("RET_01", OracleType.VarChar)
RET_01.Size = 20	' 長さ
RET_01.Direction = ParameterDirection.Output
' パラメータを追加
myCommand.Parameters.Add(RET_01)

' シーケンスで設定された番号を取得するパラメータ
Dim RET_02 As New OracleParameter("RET_02", OracleType.Number)
RET_02.Direction = ParameterDirection.Output
' パラメータを追加
myCommand.Parameters.Add(RET_02)

' sysdate 関数で設定された、更新日と更新時刻を取得するパラメータ
Dim RET_03 As New OracleParameter("RET_03", OracleType.DateTime)
RET_03.Direction = ParameterDirection.Output
' パラメータを追加
myCommand.Parameters.Add(RET_03)

' 実行
Try
	myCommand.ExecuteNonQuery()
Catch ex As Exception
	Console.WriteLine(ex.Message)
	myCon.Close()
	Return
End Try

' パラメータで取得された情報の表示
Console.WriteLine(RET_01.Value.ToString())
Console.WriteLine(RET_02.Value.ToString())
Console.WriteLine(RET_03.Value.ToString())

Dim rowid As OracleString

' コマンドのパラメータをクリア
myCommand.Parameters.Clear()
myCommand.CommandText = _
 "INSERT INTO 採番テストテーブル" + _
 " (伝票番号, 更新日)" + _
 " VALUES(伝票番号.NEXTVAL,sysdate)"

' ROWID のみを取得する実行
Try
	myCommand.ExecuteOracleNonQuery(rowid)
Catch ex As Exception
	Console.WriteLine(ex.Message)
	myCon.Close()
	Return
End Try

' ROWID の表示
Console.WriteLine(rowid.Value.ToString())

' 接続解除
If myCon.State = ConnectionState.Open Then
	myCon.Close()
End If
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加




SQLの窓  天気  IT用語辞典
Yahoo!ニュース  マルチ辞書
PHP マニュアル  Google URL短縮 


フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ