PL/SQL ビルダーの作成(3) : 既存プロシージャのリビルド : 【VB.NET】

↓ソースコードのダウンロード
ブラウザでダウンロード



ツールバーにビルド用ボタンを追加
ツールバーボタンを追加し、そのイベントを別のソースに記述します。
追加でクラスを PLSQL.vb で作成し、先頭の記述を Partial Class Form1 に変更します。
( PLSQL.Designer.vb は必要無いので削除して下さい )

※ ボタン画像の変更は こちら を参照して下さい
Partial Class Form1

	' ******************************************************
	' PL/SQL のビルド
	' ******************************************************
	Private Sub ビルド_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles ビルド.Click


	End Sub

End Class

対象プロシージャ名の取得
正規表現を利用して、表示されているテキストからプロシージャ名を取得し、
存在しない場合はエラーメッセージを表示します

Imports lightbox.control
Imports System.Text.RegularExpressions

Partial Class Form1

	' ******************************************************
	' PL/SQL のビルド
	' ******************************************************
	Private Sub ビルド_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles ビルド.Click

		Dim fpat As String = "^\s*function\s+([^\s]+)\s"
		Dim ppat As String = "^\s*procedure\s+([^\s]+)\s"

		' 正規表現で、テキストソース上のビルド対象名を取得する
		Dim m As Match
		Dim target As String
		Dim type As String = ""

		m = Regex.Match( _
		 Me.LboxEditor1.Text, _
		 fpat, _
		 RegexOptions.IgnoreCase Or RegexOptions.Multiline)

		If m.Success Then
			Console.WriteLine(m.Groups(1))
			target = m.Groups(1).ToString()
			type = "F"
		Else
			m = Regex.Match( _
			 Me.LboxEditor1.Text, _
			 ppat, _
			 RegexOptions.IgnoreCase Or RegexOptions.Multiline)

			If m.Success Then
				Console.WriteLine(m.Groups(1))
				target = m.Groups(1).ToString()
				type = "P"
			End If
		End If

		If type = "" Then
			LboxText.MessageError("対象のファンクションまたはプロシージャ名を取得できません")
			Exit Sub
		End If

	End Sub

End Class

ビルドとメッセージの取得


PL/SQL のビルドには、コマンドオブジェクトを使っていますが、
SQL のエラーが無ければビルド上エラーは発生しません。
しかし、PL/SQL の構文でエラーが発生している場合があるので、
接続オプジェクトを使ってイベントメッセージを取得します

Imports lightbox.control
Imports System.Text.RegularExpressions
' ● ビルド用に追加
Imports lightbox.db
' ● Oracle 警告ハンドラ用に追加
Imports System.Data.OracleClient

Partial Class Form1

	Public build_Handle As PLSQL
	Public build_Status As String = ""

	' ******************************************************
	' PL/SQL のビルド
	' ******************************************************
	Private Sub ビルド_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles ビルド.Click

		Dim fpat As String = "^\s*function\s+([^\s]+)\s"
		Dim ppat As String = "^\s*procedure\s+([^\s]+)\s"

		' 正規表現で、テキストソース上のビルド対象名を取得する
		Dim m As Match
		Dim target As String = ""
		Dim type As String = ""

		m = Regex.Match( _
		 Me.LboxEditor1.Text, _
		 fpat, _
		 RegexOptions.IgnoreCase Or RegexOptions.Multiline)

		If m.Success Then
			Console.WriteLine(m.Groups(1))
			target = m.Groups(1).ToString()
			type = "F"
		Else
			m = Regex.Match( _
			 Me.LboxEditor1.Text, _
			 ppat, _
			 RegexOptions.IgnoreCase Or RegexOptions.Multiline)

			If m.Success Then
				Console.WriteLine(m.Groups(1))
				target = m.Groups(1).ToString()
				type = "P"
			End If
		End If

		If type = "" Then
			LboxText.MessageError("対象のファンクションまたはプロシージャ名を取得できません")
			Exit Sub
		End If

		' ///////////////////////////////
		' ● ビルドメソッド呼び出し
		' ///////////////////////////////
		If Build(target) Then
			If build_Status <> "" Then
				Me.ToolStripStatusLabel1.Text = target + " : " + build_Status
			Else
				Me.ToolStripStatusLabel1.Text = target + " のビルドが正常終了しました"
			End If
		Else
			Me.ToolStripStatusLabel1.Text = target + " のビルドにエラーが存在します"
		End If

	End Sub

	' ******************************************************
	' ● ビルドメソッド
	' ******************************************************
	Private Function Build(ByVal Target As String) As Boolean

		Dim ret As Boolean = True

		' 既に一度インスタンスが作成されている場合
		If Not build_Handle Is Nothing Then
			build_Handle.CloseAndDispose()
		End If

		' Oracle 用インスタンス作成
		build_Handle = New PLSQL( _
		 Me.Server + "/" + Me.Service, _
		 Me.User, _
		 Me.Pass _
		)

		' 砂時計カーソル
		Me.Cursor = Cursors.WaitCursor

		' 接続
		If Not build_Handle.Connect() Then
			LboxText.MessageError("接続に失敗しました")
			Console.WriteLine(build_Handle.myError)
			' カーソルとウインドウをを元に戻す
			Me.Cursor = Cursors.Default
			Exit Function
		End If

		' ///////////////////////////////
		' ● Oracle 警告ハンドラ の登録
		' ///////////////////////////////
		build_Status = ""
		AddHandler build_Handle.myCon.InfoMessage, AddressOf olacle_info

		Dim psText As String = "create or replace " + Me.LboxEditor1.Text

		If Not build_Handle.Build(psText) Then
			ret = False
			LboxText.MessageError(build_Handle.myError)
		End If

		' 接続解除
		build_Handle.Close()

		' カーソルを元に戻す
		Me.Cursor = Cursors.Default

		Return ret

	End Function

	' ******************************************************
	' ● Oracle 警告ハンドラ
	' ******************************************************
	Private Sub olacle_info(ByVal sender As System.Object, _
	ByVal e As OracleInfoMessageEventArgs)

		Console.WriteLine(e.Message)
		build_Status = e.Message

	End Sub

End Class