2

概要

以下と同様の EXCEPTION ブロックを持つ Oracle プロシージャがあります。raise_application_error の出力を Microsoft Access に戻し、ユーザーに表示したいと考えています。この Oracle Procedure を呼び出すのは Microsoft Access です。

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プロシージャを関数に変えることである場合、誰かがそれを適切に行う方法に触れてほしい(つまり、例外をトラップしてから値を返す)

背景情報

Access データベースをフロント エンドとして使用して、Oracle データベースにデータをインポートするためのユーザーランド ツールを作成しています。データは Excel からインポートされ、クリーンアップされ、修正され、さまざまな検証チェックに対してテストされます。次に、Access は ADO を使用してデータを Oracle サーバー上のテーブルに書き込み、PL/SQL プロシージャを呼び出して処理します。

この手順では、いくつかの検証チェックが実行されます (一部は重複しており、一部は DB に固有です)。渡されると、各レコードが読み取られて解釈され、データベース内の正規化されたテーブルに入力されます。

Access で既に実行されている検証チェックの量を考慮すると、Oracle プロシージャからエラーが発生することはまったく期待していませんが、エラーが発生した場合は、エラーを Access に戻してユーザーに表示したいと考えています。

私が試したこと

このフォーラムと Google で検索しました。私が読んだことから- 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: 無効な SQL ステートメント

4

1 に答える 1

1

2 週間かけてさまざまなことを試した後、機能し始めました。ODBC ドライバーとストアド プロシージャ コマンド テキストではなく、OLEDB プロバイダーを使用することに関係があると感じました。また、ストアド プロシージャをパッケージに移動しました。

オラクルのセットアップ

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 に答える