2013-08-28 1 views
1

ADO Command 개체를 사용하여 Access/VBA를 사용하여 Oracle 저장 프로 시저에서 결과 집합을 검색하려고합니다. . (즉 명령 대신 실행 사용하고 그 일을 다른 방법을 시도 - 나는 그것의 수행 방법에 대한 그물에 기사의 수를 읽은ADO Command Object에서 호출 할 때 Oracle ORA-06550 식별자를 선언해야합니다.

[Oracle][ODBC][Ora]ORA-06550: line 1, column 19: 
PLS-00201: identifier 'RETURNDATA' must be declared 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

:

나는 오류를 수신 유지 개체)하지만 나는 그것을 작동시킬 수없는 것 같습니다.

Microsoft는이 작업을 수행하는 방법에 대한 지식 기반 문서를 잘 가지고 있지만 - 예를 따르지 만 작동하지 않을 수 있습니다. 나는 오라클 SQL Developer에서 실행 PL/SQL, 반환 값이 출력 변수에 창을 나열 http://support.microsoft.com/kb/176086

. 이것은 저장 프로 시저가 작동하고 필요한 권한이 부여되었음을 알려줍니다.

오라클 버전 :

SELECT * 브이 $ 버전에서

Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production 
PL/SQL Release 9.2.0.8.0 - Production 
"CORE 9.2.0.8.0 Production" 
TNS for 32-bit Windows: Version 9.2.0.8.0 - Production 
NLSRTL Version 9.2.0.8.0 - Production 

오라클 패키지 정의 :

CREATE OR REPLACE 
PACKAGE test AUTHID DEFINER AS 
    PROCEDURE testSP (returnData OUT NUMBER); 
END test; 
/
CREATE OR REPLACE 
PACKAGE BODY test AS 
    PROCEDURE testSP (returnData OUT NUMBER) IS 
    BEGIN 
     returnData := 7; 
    END; 
END test; 

MS 액세스 VBA 코드

,536,913,632 10
Public Sub testSP() 
    Dim oraConn As ADODB.Connection 
    Dim oraCmd As ADODB.Command 
    Dim oraRetSet As ADODB.Recordset 
    Dim oraNum As Integer 

    Set oraConn = New ADODB.Connection 

    ' Discovered I need to set this to Read/Write or the SP cannot do any INSERT operations 
    oraConn.Mode = adModeReadWrite 

    ' Connect to the Oracle Server 
    oraConn.Open "Driver={Oracle in OraHome102};dbq=oradsn;Uid=username;Pwd=password" 

    ' Set up our Command. 
    Set oraCmd = New ADODB.Command 
    Set oraCmd.ActiveConnection = oraConn 
    oraCmd.CommandType = adCmdText 
    oraCmd.Parameters.Append oraCmd.CreateParameter("returnData", adNumeric, adParamOutput) 
    oraCmd.CommandText = "{CALL test.testSP({resultset 1, returnData})}" 

    ' Set up our Recordset 
    Set oraRetSet = New ADODB.Recordset 
    oraRetSet.CursorType = adOpenStatic 

    ' Attach our Recordset to our Command 
    Set oraRetSet.Source = oraCmd 

    ' Open our Recordset 
    oraRetSet.Open 

    ' Retreive our Stored Procedure Result 
    oraNum = oraRetSet.Fields(0).Value 

    ' Display Result to user 
    Debug.Print ">>> Return Value: " & oraNum 

    ' Close the Recordset & Connection Objects 
    oraRetSet.Close 
    oraConn.Close 

    ' Clean Up 
    Set oraConn = Nothing 
    Set oraCmd = Nothing 
    Set oraRetSet = Nothing 

End Sub 

저는 실제로 공백을 그리는 중입니다. 이는 필자가 놓친 작은 것이 었음을 의미합니다. 어떤 도움을 주시면 감사하겠습니다.

업데이트 Aug 29 나는 아무런 진전을 이루지 못했다. 나는 가이드로 또 다른 유래 질문/대답 다음, OLEDB 공급자에 ODBC 전환을 시도 :

How do I call an Oracle stored procedure from an Excel VBA script?

' Connect to the Oracle Server 
oraConn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=oradsn;" & _ 
       "User ID=username;Password=password;" 
oraConn.Open 

Set oraCmd = New ADODB.Command 
Set oraCmd.ActiveConnection = oraConn 
oraCmd.Parameters.Append oraCmd.CreateParameter("returnData", adSmallInt, adParamOutput) 
oraCmd.Properties("PLSQLRSet") = True 
oraCmd.CommandText = "{CALL test.testSP(?)}" 
Set oraRetSet = oraCmd.Execute 
oraCmd.Properties("PLSQLRSet") = False 

oraNum = oraRetSet.Fields(0).Value 

이이 선언되지 않은 식별자를 제거한다,하지만 모든 레코드를 반환하지 않습니다 .. oraRetSet.Fields.Count는 0과 같습니다.

답변

1

마지막으로 무슨 일이 벌어 졌는지 알아 냈습니다. - 오류 코드 http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php

내가 특정 값을 반환하려고했다 :

이 웹 사이트는 마침내 빛의 회전을 만든 것입니다. ADO에서 레코드 집합을 사용하면 데이터 집합을 반환 할 때 더욱 유용합니다.

커서 참조를 반환하려면 레코드 세트로 OUT 매개 변수를 SYS_REFCURSOR와 같은 커서 참조 데이터 형식으로 설정해야합니다.

create or replace 
PROCEDURE list_staff (r_stafflist OUT SYS_REFCURSOR) AS 
    BEGIN 
     OPEN r_stafflist FOR 
     SELECT name, 
       telephone, 
       department 
     FROM stafflist 
     ORDER BY name; 
    END list_staff; 

그런 다음 ADO는 명령이 실행될 때 참조 커서에 자동으로 바인딩됩니다. ADO Command 개체 매개 변수에 커서를 추가하지 마십시오.