在Access中获取(Oracle)存储过程输出参数的结果

时间:2015-11-24 22:28:56

标签: oracle ms-access stored-procedures

我从未使用过存储过程,所以我完全迷失了。我们的一位DB管理员在Oracle中创建了一个SP,它接受三个变量,并有一个OUT变量。我打电话后如何查看程序的结果?

DECLARE
v_srch_sw         VARCHAR2(1);
v_srch_crit       VARCHAR2(20);
v_ssn_last_four   VARCHAR2(4);
v_ivr_data        VARCHAR2(4000);

BEGIN
    DBMS_OUTPUT.enable(buffer_size => NULL);
    v_srch_sw       := 'A';
    v_srch_crit     := '1234567890';
    v_ssn_last_four := '1234';


schemaname.sp_name_010(v_srch_sw
                        ,v_srch_crit
                        ,v_ssn_last_four
                        ,v_ivr_data);

DBMS_OUTPUT.PUT_LINE(v_ivr_data);                           
END;
/

注意:DBMS_OUTPUT.PUT_LINE将结果作为消息返回,但不是实际结果。例如,当我将此代码作为传递查询放在MS Access '07中时,不会返回任何结果。如何像普通的SELECT查询一样返回结果?

1 个答案:

答案 0 :(得分:1)

  

如何像普通的SELECT查询一样返回结果?

首先,请注意问题中的代码不是存储过程,而是调用存储过程的PL / SQL代码,并在Oracle中显示结果。

其次,AFAIK无法从Access调用该存储过程“像普通的SELECT查询”,因为存储过程不返回结果集。相反,它将其值作为输出参数返回。

但是,可以在VBA中创建一个调用存储过程并返回结果的函数。以下示例适用于SQL Server,但Oracle的代码应该非常相似。 (例如,参数名称可能略有不同,可能省略@前缀。)

Option Compare Database
Option Explicit

Public Function Call_sp_name_010(v_srch_sw As String, v_srch_crit As String, v_ssn_last_four As String) As Variant
    Const linkedTableName = "dbo_Clients"  ' an existing ODBC linked table

    Dim cdb As DAO.Database
    Set cdb = CurrentDb

    Dim con As New ADODB.Connection
    con.Open "DSN=" & Mid(cdb.TableDefs(linkedTableName).Connect, 5)  ' omit "ODBC;" prefix

    Dim cmd As New ADODB.Command
    cmd.ActiveConnection = con
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "schemaname.sp_name_010"
    cmd.Parameters.Append cmd.CreateParameter("@v_srch_sw", adVarChar, adParamInput, 1)
    cmd.Parameters.Append cmd.CreateParameter("@v_srch_crit", adVarChar, adParamInput, 20)
    cmd.Parameters.Append cmd.CreateParameter("@v_ssn_last_four", adVarChar, adParamInput, 4)
    cmd.Parameters.Append cmd.CreateParameter("@v_ivr_data", adVarChar, adParamOutput, 4000)

    cmd.Parameters("@v_srch_sw").Value = v_srch_sw
    cmd.Parameters("@v_srch_crit").Value = v_srch_crit
    cmd.Parameters("@v_ssn_last_four").Value = v_ssn_last_four
    cmd.Execute

    ' function returns output parameter value
    Call_sp_name_010 = cmd.Parameters("@v_ivr_data").Value

    Set cmd = Nothing
    con.Close
    Set con = Nothing
    Set cmd = Nothing
End Function

现在,如有必要,您可以在Access查询中使用该用户定义的函数。