2

2 つのテーブルにデータを保存しようとして Oracle トランザクションを作成しましたが、ロールバックを呼び出して動作するかどうかを確認する 2 番目の手順でエラーが発生しました。

最初の手順では、 を使用して USER_SCHEDULER_JOBS にジョブを作成しますsys.dbms_scheduler.create_job

Private Function CreateJobDef() As Integer
    Try
        Cursor.Current = Cursors.WaitCursor
        conn = New OracleConnection
        conn.ConnectionString = gApp.ConnectString
        conn.Open()
        Dim cmd As OracleCommand = conn.CreateCommand()
        Dim oraclTrans As OracleTransaction
        oraclTrans = conn.BeginTransaction()

        cmd.Transaction = oraclTrans

        Try
            cmd.CommandText = "TEST.CREATE_JOB_SCHEDULE"
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.Clear()
            OracleCommandBuilder.DeriveParameters(cmd)
            cmd.Parameters("in_job_name").Value = txtName.Text
            cmd.Parameters("in_schedule_name").Value = cboSchedule.SelectedValue
            cmd.Parameters("in_enabled").Value = If(chkEnabled.Checked, 1, 0)
            cmd.Parameters("in_comments").Value = txtComments.Text
            cmd.ExecuteNonQuery()
            'Everything is OK
            '-----------------------------------------------
            cmd.CommandText = "TEST.Update_Job_Def"
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.Clear()
            OracleCommandBuilder.DeriveParameters(cmd)
            cmd.Parameters("in_job_id").Value = "WQwqwq" 'I set this to a string to cause an error in the second procedure to check the rollback
            cmd.Parameters("in_job_name").Value = txtName.Text
            cmd.Parameters("in_job_type").Value = cboType.SelectedItem
            cmd.Parameters("in_report_nav_id").Value = cboReport.SelectedValue
            cmd.Parameters("in_mail_address_to").Value = txtMailTo.Text
            cmd.ExecuteNonQuery()

            oraclTrans.Commit()
        Catch ex As OracleException
            Msgbox(ex.ToString)
            oraclTrans.Rollback()
        Catch ex As Exception
               Msgbox(ex.ToString)
            oraclTrans.Rollback()
        Finally
            conn.Close()
            If conn IsNot Nothing Then conn.Dispose()
            If cmd IsNot Nothing Then cmd.Dispose()
        End Try
    Catch ex As OracleException
          Msgbox(ex.ToString)
    Catch ex As Exception
           Msgbox(ex.ToString)
    Finally
        Cursor.Current = Cursors.Default
    End Try
End Function

問題は、最初の手順で新しいジョブを作成することですが、2 番目の手順でエラーが発生し、ロールバックが呼び出されます。何か案は?

ありがとう

4

1 に答える 1

2

DDL ステートメント、およびスケジュールされたジョブなどのオブジェクトを作成または変更する多くの Oracle プロシージャ コールには、暗黙的なコミットがあります。したがって、ジョブ作成手順をロールバックすることはできません。

于 2013-09-16T12:15:04.860 に答える