Ruby OCI8和Oracle存储过程-如何访问';什么是参考光标?

Ruby OCI8和Oracle存储过程-如何访问';什么是参考光标?,ruby,oracle,stored-procedures,oci8,Ruby,Oracle,Stored Procedures,Oci8,我有一个Oracle包,其中包含一个存储过程,返回一个名为prereq_list的表。 要返回的“我的数据类型”的声明为: TYPE prereq_list是VW_prereq_SVC_CD%行类型的表 我的存储过程的签名如下所示: PROCEDURE GET_PREREQS ( site_id_in IN VARCHAR2, rate_group_in IN VARCHAR2, service_code_in IN VARCHAR2, prereq_list_out out prereq_li

我有一个Oracle包,其中包含一个存储过程,返回一个名为prereq_list的表。 要返回的“我的数据类型”的声明为:

TYPE prereq_list是VW_prereq_SVC_CD%行类型的表

我的存储过程的签名如下所示:

PROCEDURE GET_PREREQS (
site_id_in IN VARCHAR2,
rate_group_in IN VARCHAR2,
service_code_in IN VARCHAR2,
prereq_list_out out prereq_list);
cursor = Warehouse::Base.connection.raw_connection.parse("BEGIN codekeeper.get_prereqs(:site, :rate_grp, :svc_code, :prereqs); END;")
cursor.bind_param(':site', '9')
cursor.bind_param(':rate_grp','3990003')
cursor.bind_param(':svc_code','RPSTARZ')
cursor.bind_param(':prereqs', nil, OCI8::Cursor )
cursor.exec()
results_cursor = cursor[':prereqs'] 
cursor.close
while row = results_cursor.fetch()
  puts row.join(',')
end
results_cursor.close    
我尝试使用Ruby和OCI8调用此存储过程,如下所示:

PROCEDURE GET_PREREQS (
site_id_in IN VARCHAR2,
rate_group_in IN VARCHAR2,
service_code_in IN VARCHAR2,
prereq_list_out out prereq_list);
cursor = Warehouse::Base.connection.raw_connection.parse("BEGIN codekeeper.get_prereqs(:site, :rate_grp, :svc_code, :prereqs); END;")
cursor.bind_param(':site', '9')
cursor.bind_param(':rate_grp','3990003')
cursor.bind_param(':svc_code','RPSTARZ')
cursor.bind_param(':prereqs', nil, OCI8::Cursor )
cursor.exec()
results_cursor = cursor[':prereqs'] 
cursor.close
while row = results_cursor.fetch()
  puts row.join(',')
end
results_cursor.close    

我知道我的基本方法是合理的。如果我用一个简单的字符串或数字替换输出变量,我可以得到任何输出。但这并不是我需要的。我需要能够返回一个真正的游标或至少一个哈希数组

这肯定是因为我没有正确阅读自己的代码。我返回的prereq\u list\u out是,go figure,而不是ref游标。这是一张桌子


如果让get_reqs返回一个sys_refcursor而不是我正在使用的自定义类型表,并将cursor.bind_param声明更改为
cursor.bind_param(':prereqs',OCI8::cursor)
将光标作为输出绑定参数返回的OCI8调用将起作用。在这里可以找到这样做的一个可靠而完整的例子:尽管您需要了解oracle的人员正在试图解决一个稍微不同的问题这一事实。他不担心返回光标,他只是这样做。他的示例是尝试从PL SQL数组中获取值。

Wups。回答这个问题。