VB.net : 一時PL/SQLを実行して、DBMS_OUTPUT の結果を取得する

  System.Data.OracleClient による実装




関連する記事

VBScript : ADO と OO4O による PL/SQL 呼び出し( 入力引数のみ )
VBScript : OO4O : 利用できるディレクトリオブジェクトの一覧
VBS/PHP : OO4O : 一時PL/SQLを実行して、DBMS_OUTPUT の結果を取得する

Imports System.Data.OracleClient

Module Module1

    Sub Main()

        Dim OraDatabase As New OracleConnection()
        Dim OraCommand As New OracleCommand()
        Dim Query As String = Nothing

        ' *******************************************
        ' 接続
        ' *******************************************
        ' 接続文字列
        OraDatabase.ConnectionString = _
         "Server=night/xe;" + _
         "User ID=LB;" + _
         "Password=LB;"

        Try
            OraDatabase.Open()
            OraCommand.Connection = OraDatabase
            ' コマンドをSQL用に変更
            OraCommand.CommandType = CommandType.Text
        Catch ex As Exception
            Console.WriteLine("1:" & ex.Message)

            ' デバッグ用一時停止
            Console.ReadLine()
            Return
        End Try

        ' *******************************************
        ' DBMS_OUTPUT の結果を取得する為に 使用可能にする
        ' *******************************************
        Query = "BEGIN DBMS_OUTPUT.ENABLE(); END;"
        OraCommand.CommandText = Query
        Try
            OraCommand.ExecuteNonQuery()
        Catch ex As Exception
            OraDatabase.Close()
            Console.WriteLine("2:" & ex.Message)

            ' デバッグ用一時停止
            Console.ReadLine()
            Return
        End Try

        ' *******************************************
        ' 一時PL/SQL
        ' *******************************************
        ' コマンドをSQL用に変更
        OraCommand.CommandType = CommandType.Text

        ' 一時PL/SQL を SQL として実行
        Query = "DECLARE WK_KEY VARCHAR2(4) := '0001';"
        Query &= " WK_NAME VARCHAR2(50);"
        Query &= " BEGIN"
        Query &= " SELECT 氏名 INTO WK_NAME"
        Query &= " FROM 社員マスタ"
        Query &= " where 社員コード = WK_KEY;"
        Query &= " DBMS_OUTPUT.PUT_LINE(WK_NAME);"
        Query &= " END;"

        OraCommand.CommandText = Query

        ' 一時PL/SQL の実行
        Try
            OraCommand.ExecuteNonQuery()
        Catch ex As Exception
            OraDatabase.Close()
            Console.WriteLine("3:" & ex.Message)

            ' デバッグ用一時停止
            Console.ReadLine()
            Return
        End Try

        ' *******************************************
        ' DBMS_OUTPUT の結果を取得する
        ' *******************************************
        ' パラメータをリセット
        OraCommand.Parameters.Clear()
        ' コマンドをプロシージャ用に変更
        OraCommand.CommandType = CommandType.StoredProcedure
        OraCommand.CommandText = "DBMS_OUTPUT.GET_LINE"

        ' パラメータの設定(1)
        Dim PARAM As OracleParameter = _
          New OracleParameter("line", OracleType.VarChar)
        PARAM.Direction = ParameterDirection.Output
        PARAM.Size = 200
        OraCommand.Parameters.Add(PARAM)

        ' パラメータの設定(2)
        Dim STATUS As OracleParameter = _
         New OracleParameter("status", OracleType.Number)
        STATUS.Direction = ParameterDirection.Output
        OraCommand.Parameters.Add(STATUS)

        ' 実行
        Try
            OraCommand.ExecuteNonQuery()
        Catch ex As Exception
            OraDatabase.Close()
            Console.WriteLine("4:" & ex.Message)

            ' デバッグ用一時停止
            Console.ReadLine()
            Return
        End Try

        ' DBMS_OUTPUT を取得
        Do While STATUS.Value = 0

            Console.WriteLine(PARAM.Value.ToString())

            Try
                OraCommand.ExecuteNonQuery()
            Catch ex As Exception
                Exit Do
            End Try

        Loop

        ' パラメータをリセット
        OraCommand.Parameters.Clear()
        OraDatabase.Close()


        ' デバッグ用一時停止
        Console.ReadLine()

    End Sub

End Module




  OracleInProcServer を使用した実装



Module Module1

    Sub Main()

        Dim OraSession As New OracleInProcServer.OraSessionClass()
        Dim OraDatabase As OracleInProcServer.OraDatabase

        Dim Query As String = Nothing

        ' *******************************************
        ' 接続
        ' *******************************************
        Try
            OraDatabase = OraSession.OpenDatabase( _
                "night/xe", _
                "LB/LB", _
                OracleInProcServer.dbOption.ORADB_DEFAULT _
                )
        Catch ex As Exception
            Console.WriteLine(ex.Message)

            ' デバッグ用一時停止
            Console.ReadLine()
            Return
        End Try

        Query = "BEGIN DBMS_OUTPUT.ENABLE(); END;"
        OraDatabase.ExecuteSQL(Query)

        ' 一時PL/SQL を SQL として実行
        Query = "DECLARE WK_KEY VARCHAR2(4) := '0001';"
        Query &= " WK_NAME VARCHAR2(50);"
        Query &= " BEGIN"
        Query &= " SELECT 氏名 INTO WK_NAME"
        Query &= " FROM 社員マスタ"
        Query &= " where 社員コード = WK_KEY;"
        Query &= " DBMS_OUTPUT.PUT_LINE(WK_NAME);"
        Query &= " END;"

        ' CrLf では動かないので、Lf に変換して実行
        Query = Query.Replace(ControlChars.CrLf, ControlChars.Cr)
        Call OraDatabase.ExecuteSQL(Query)

        ' DBMS_OUTPUT.GET_LINE の仕様に基づいてパラメータの設定
        Call OraDatabase.Parameters.Add("PARAM", "", _
            OracleInProcServer.paramMode.ORAPARM_OUTPUT)
        OraDatabase.Parameters("PARAM").ServerType = _
            OracleInProcServer.serverType.ORATYPE_VARCHAR2

        Call OraDatabase.Parameters.Add("STATUS", 0, _
            OracleInProcServer.paramMode.ORAPARM_OUTPUT)
        OraDatabase.Parameters("STATUS").ServerType = _
            OracleInProcServer.serverType.ORATYPE_NUMBER

        ' 結果を読みだす為のメソッドを実行
        Query = "BEGIN DBMS_OUTPUT.GET_LINE(:PARAM,:STATUS); END;"
        Call OraDatabase.ExecuteSQL(Query)

        ' メモリ上のデータを読み出し
        Do While OraDatabase.Parameters("STATUS").Value = 0
            ' 表示
            Console.WriteLine(OraDatabase.Parameters("PARAM").Value)
            ' 繰り返し
            OraDatabase.ExecuteSQL(Query)
        Loop

        ' パラメータの削除
        Call OraDatabase.Parameters.Remove("STATUS")
        Call OraDatabase.Parameters.Remove("PARAM")


        ' デバッグ用一時停止
        Console.ReadLine()

    End Sub

End Module













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





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

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ