2013-08-13 3 views
2

요약Microsoft 액세스 내에서 Oracle raise_application_error 사용자 지정 메시지를 가로채는 중입니까?

다음과 유사한 EXCEPTION 블록이있는 Oracle 프로 시저가 있습니다. raise_application_error의 출력을 다시 Microsoft Access로 전달하여 사용자에게 표시하려고합니다. 이 Oracle 프로 시저를 호출하는 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 데이터베이스로 가져 오는 userland 도구를 작성했습니다. 데이터를 Excel에서 가져 와서 정리하고 수정하고 다양한 유효성 검사에 대해 테스트합니다. Access는 ADO를 사용하여 Oracle 서버의 테이블에 데이터를 쓰고 PL/SQL 프로 시저를 호출하여 처리합니다.

이 절차는 여러 가지 유효성 검사를 수행합니다 (일부는 복제본이고 일부는 DB에만 해당). 전달되면 각 레코드를 읽고 해석하고 정규화 된 테이블을 데이터베이스에 채 웁니다.

Access에서 이미 실행중인 유효성 검사의 양을 고려할 때 Oracle 프로 시저에서 발생한 오류는 실제로 기대하지 않습니다. 그렇지만 오류가 있으면 Access로 다시 전달하고 표시하고 싶습니다. 사용자에게 내가

나는이 포럼에서 검색, 구글 한 시도했습니다 무엇

. 내가 읽은 것 - raise_application_error는 호출 클라이언트에 출력을 반환합니다.하지만 OLE DB 공급자와 Oracle과 Access 사이에 ADO DB API가 있다고 가정하면 오류가 캡슐화되고 단순한 Pass/Fail이 리턴되고있는 것 같습니다. 실행] 호출에서 : 하나의 오류

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 문 다양한 일을 시도 2 ​​주 지출 후

답변

1

는 - 그것은 일하기 시작했다. 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