2013-08-28 3 views
1

Я пытаюсь использовать Access/VBA для извлечения набора результатов из моей хранимой процедуры Oracle, используя объект ADO Command.Идентификатор Oracle ORA-06550 должен быть объявлен при вызове из ADO Command Object

Я продолжаю получать сообщение об ошибке:

[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 была хорошая статья базы знаний о том, как это сделать, но, несмотря на то, что они следуют их примеру, я не могу заставить ее работать. http://support.microsoft.com/kb/176086

Когда я Run PL/SQL в Oracle SQL Developer, возвращаемое значение указано в выходных переменных окна. Это говорит мне, что и хранимая процедура работает, и необходимые разрешения были предоставлены.

Oracle Версия:

SELECT * FROM v $ версии

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 

Oracle Определение пакета:

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 Access VBA Code

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 

Я действительно рисую пробелы - что значит его, вероятно, что-то маленькое, что я пропустил. Любая помощь будет оценена по достоинству.

Обновление от 29 августа Я не достиг прогресса. Я пытался перейти от ODBC к OLEDB Provider, после другой StackOverflow вопрос/ответ, как руководство:

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 больше предназначено для возврата набора данных.

Если вы хотите вернуть курсор ref в качестве набора записей, вам необходимо установить параметр 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 автоматически связывается с курсором ref при выдаче команды. Вы не добавляете курсор к параметрам объекта ADO Command.