【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
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[dnettool]
claudebot
24/03/29 21:45:51
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube