2

我有一个 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    

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

4

1 回答 1

3

这绝对是没有正确阅读我自己的代码的情况。我要返回的 prereq_list_out 是,看图,而不是参考游标。这是一张桌子。

如果您让 get_reqs 返回一个 sys_refcursor 而不是我正在使用的自定义类型 TABLE ,并将 cursor.bind_param 声明更改cursor.bind_param(':prereqs', OCI8::Cursor)为 oci8 调用以返回一个游标作为输出 bind_param 将起作用。可以在此处找到一个可靠且完整的示例:https ://blogs.oracle.com/opal/entry/casting_plsql_arrays_as_ref_cu尽管您需要阅读甲骨文的人正在尝试解决一个稍微不同的事实问题。他不担心返回光标,他只是这样做。他的示例是关于尝试从 PL SQL 数组中获取值。

于 2013-07-02T16:21:23.153 回答