Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Access中(Oracle)存储过程输出参数的结果_Oracle_Ms Access_Stored Procedures - Fatal编程技术网

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

获取Access中(Oracle)存储过程输出参数的结果,oracle,ms-access,stored-procedures,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(

我从未使用过存储过程,所以我完全迷路了。我们的一个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_行将结果作为消息返回,但不是实际结果。例如,当我将此代码作为传递查询放入MS Access'07中时,不会返回任何结果。如何让它像普通的SELECT查询一样返回结果

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

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

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

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

选项比较数据库
选项显式
公共函数调用_sp_name_010(v_srch_sw作为字符串,v_srch_crit作为字符串,v_ssn_last_four作为字符串)作为变量
Const linkedTableName=“dbo_Clients””现有ODBC链接表
Dim cdb作为DAO.Database
设置cdb=CurrentDb
Dim con作为新的ADODB连接
con.打开“DSN=“&Mid(cdb.TableDefs(linkedTableName).Connect,5)”忽略“ODBC;”前缀
Dim cmd作为新的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)
命令参数(“@v_srch_sw”)。值=v_srch_sw
cmd.Parameters(“@v_srch_crit”)。Value=v_srch_crit
cmd.Parameters(“@v\u ssn\u last\u four”)。Value=v\u ssn\u last\u four
cmd.Execute
'函数返回输出参数值
调用_sp_name_010=cmd.Parameters(“@v_ivr_data”).Value
Set cmd=Nothing
结案
设置con=Nothing
Set cmd=Nothing
端函数

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

我认为您缺少关键字
call
。您需要从程序中调用存储过程,并将
out
变量捕获到合适的变量中。如果您在oracle/plsql中搜索
call
,您应该可以找到一些通用语言(java等)的示例。我不是访问专家,但我不确定它是否可以使用
out
参数调用过程,并对结果做任何有用的操作。此过程是否正在修改数据库中的数据?如果不是,我强烈怀疑它应该是一个存储函数,而不是一个存储过程,然后您可以像任何其他函数一样在
select
语句中调用它。是否将pass-through查询设置为返回记录?我将检查此设置(显示PT查询的属性表以检查或设置此值)。