2

概括

我有一个 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,我猜测错误正在被封装并且正在返回一个简单的通过/失败从执行调用:

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

4

1 回答 1

1

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

甲骨文设置

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
于 2013-08-29T18:40:56.483 回答