我有一个Oracle包,其中有一个存储过程,它返回一个名为prereq_list的表。
返回的数据类型声明是:TYPE prereq_list IS TABLE OF VW_PREREQ_SVC_CD%ROWTYPE;
我的存储过程的签名如下:
PROCEDURE GET_PREREQS (
site_id_in IN VARCHAR2,
rate_group_in IN VARCHAR2,
service_code_in IN VARCHAR2,
prereq_list_out out prereq_list);
我试图使用ruby和oci8调用这个存储过程,如下所示:
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_list_out是,go figure,而不是ref游标。这是一张桌子。
如果让get_reqs返回sys_refcursor而不是我正在使用的自定义类型表,并将cursor.bind_param声明更改为cursor.bind_param(':prereqs', OCI8::Cursor)
将游标作为输出bind_param返回的oci8调用将起作用。在这里可以找到一个完整可靠的例子:https://blogs.oracle.com/opal/entry/casting_plsql_arrays_as_ref_cu尽管您需要了解Oracle的人正在试图解决一个稍微不同的问题。他不担心返回光标,他只是这样做。他的例子是试图从pl sql数组中获取值。
关于ruby - Ruby OCI8和Oracle存储过程-如何访问作为引用游标的bind_param?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17372806/