我有一个我在Oracle中定义的存储过程.在那个过程中,我需要返回一个记录集.要做到这一点,我使用的是SYS_REFCURSOR,在Oracle内部(和cx_Oracle,在这个问题上)很好用.在我的应用程序中,我使用SqlAlchemy作用域会话,以支持多线程.
如何使用作用域会话返回REF CURSOR?我能够使其工作的唯一方法是使用在会话中处于活动状态的光标声明一个out游标,然后执行存储过程,如下所示:
sql = """
BEGIN
example('%s', '%s', '%s', :cur);
END;
""" % (cid, show, type)
conn = sa_tool.session.connection()
in_cur = conn._Connection__connection.cursor()
out_cur = conn._Connection__connection.cursor()
in_cur.execute(sql, cur=out_cur)
results = out_cur.fetchall()
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望避免以这种方式使用连接对象,并在让SqlAlchemy管理游标的同时执行该过程.如果那是不可能的,那么获取这么长时间是否有理由?
谢谢,
扎克
我有一个执行两步查询的存储过程.第一步是从表中收集VARCHAR2类型字符的列表,并将它们收集到表变量中,定义如下:
TYPE t_cids IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
v_cids t_cids;
Run Code Online (Sandbox Code Playgroud)
基本上我有:
SELECT item BULK COLLECT INTO v_cids FROM table_one;
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到下一位.
现在我想在同一个过程中的另一个查询的where子句中使用该集合,如下所示:
SELECT * FROM table_two WHERE cid IN v_cids;
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我能够选择一个单独的元素,但我想使用表变量,就像使用常规表一样.我尝试过使用嵌套选择的变体,但这似乎也不起作用.
非常感谢,
扎克