【问题标题】:Intercepting Oracle raise_application_error custom messages within Microsoft Access?在 Microsoft Access 中拦截 Oracle raise_application_error 自定义消息?
【发布时间】:2013-08-15 11:45:55
【问题描述】:

总结

我有一个 Oracle 过程,它具有与下面类似的 EXCEPTION 块。我想将 raise_application_error 的输出传递回 Microsoft Access 并将其显示给用户。是 Microsoft Access 调用了这个 Oracle 过程。

EXCEPTION
  WHEN e_invalidids THEN
    raise_application_error (-20001,'Invalid ids in Upload Table.');
  WHEN e_missingdate THEN
    raise_application_error (-20002,'Missing Date in Upload Table.');
  WHEN OTHERS THEN
    raise_application_error (-20000,'An error was encountered - ' || SQLCODE || ' -ERROR- ' || SQLERRM);
END;

请求

我想指出正确的方向 - 给定一种在 Access 中报告此错误的方法。

如果解决方案是将 Oracle 过程转换为函数 - 那么我希望有人能够正确地 谈谈如何做到这一点(即捕获异常然后返回值)

背景信息

我正在编写一个用户空间工具来将数据导入 Oracle 数据库,使用 Access 数据库作为前端。数据从 Excel 导入、清理、更正,并针对各种验证检查进行测试。 Access 然后使用 ADO 将数据写入 Oracle 服务器上的表,然后调用 PL/SQL 过程来处理它。

该过程执行许多验证检查(有些是重复的,有些是特定于数据库的)。通过后,它会读入每条记录 - 对其进行解释 - 并填充数据库中的规范化表。

考虑到已经在 Access 中进行的验证检查的数量,我真的不希望 Oracle 过程会引发任何错误 - 但如果有,我希望将错误传递回 Access 并显示到用户。

我的尝试

我在这个论坛和谷歌上搜索过。从我读到的 - raise_application_error 将输出返回给调用客户端 - 但鉴于 Oracle 和 Access 之间有一个 OLE DB 提供程序和 ADO DB API,我猜测错误正在被封装并且正在返回一个简单的通过/失败来自 Execute 调用:

oraConn.Execute "import_data"
oraErrText = ""
Set oraErrors = oraConn.Errors

For Each oraError In oraErrors
  debug.print oraError.Number
  debug.print oraError.Description
  debug.print oraError.Source
  debug.print oraError.SQLState 
  debug.print oraError.NativeError
Next

以上导致单一错误:ORA-00900: invalid SQL statement

【问题讨论】:

    标签: oracle ms-access exception-handling error-handling adodb


    【解决方案1】:

    在花了两个星期尝试各种事情后 - 它开始起作用了。我感觉这与使用 OLEDB Provider 而不是 ODBC 驱动程序和存储过程命令文本有关。我还把我的存储过程移到了一个包中。

    Oracle 设置

    create or replace 
    PACKAGE test AS
      PROCEDURE testSP;
    END test;
    /
    create or replace 
    PACKAGE BODY test AS
      PROCEDURE testSP IS
      BEGIN
        DECLARE
          e_test EXCEPTION;
        BEGIN
          RAISE e_test;
        EXCEPTION
          WHEN e_test THEN
            raise_application_error (-20001,'Test Error');
            RETURN;
        END;
      END;
    END test;
    

    VBA 代码:

    Public Sub testSP(dbCredDSN As String, dbCredUser As String, dbCredPW As String)
      Dim oraConn As ADODB.Connection
      Dim oraCmd As ADODB.Command
      Dim oraError As ADODB.Error
    
      Set oraConn = New ADODB.Connection
    
      ' Open our Connection
      Set oraConn = New ADODB.Connection
      oraConn.Mode = adModeReadWrite
      oraConn.Provider = "OraOLEDB.Oracle"
      oraConn.Properties("Data Source") = dbCredDSN
      oraConn.Properties("User ID") = dbCredUser
      oraConn.Properties("Password") = dbCredPW
      oraConn.Open
    
       ' Set up our Command.
      Set oraCmd = New ADODB.Command
      Set oraCmd.ActiveConnection = oraConn
      oraCmd.CommandText = "{CALL test.testSP()}"
      On Error Resume Next
      oraCmd.Execute
      On Error GoTo 0
    
      For Each oraError In oraConn.Errors
        Debug.Print "Number:       " & oraError.Number
        Debug.Print "Description:  " & oraError.Description
        Debug.Print "Source:       " & oraError.Source
        Debug.Print "SQL State:    " & oraError.SQLState
        Debug.Print "Native Error: " & oraError.NativeError
      Next
    
      ' Close the Recordset & Connection Objects
      oraConn.Close
    
      ' Clean Up
      Set oraConn = Nothing
      Set oraCmd = Nothing
    End Sub
    

    执行:

    testSP "myDSN","myUsername","myPassword"
    
    Number:       -2147217900
    Description:  ORA-20001: Test Error
    ORA-06512: at "TESTSERVER.TEST", line 10
    ORA-06512: at line 1
    Source:       OraOLEDB
    SQL State:    
    Native Error: 20001
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多