我从未使用过存储过程,所以我完全迷失了。我们的一位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查询一样返回结果?
答案 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查询中使用该用户定义的函数。