python - 使用 cx_Oracle 从 ref 游标中检索列名

标签 python cx-oracle

在使用 cx_Oracle 调用一个简单的存储过程时,我可以很容易地从过程中取回数据,如下所示:

db = db_class() #Sets up stuff, etc.
conn = db.connect() #Returns a connection to the database

cursor = conn.cursor()
l_results = cursor.var(cx_Oracle.CURSOR)

res = cursor.callproc("PROG.DATA.GET_EVENTS", [1,2,l_results]) 
#params = siteID, userID, ref cursor

res[2] 最终成为某种可枚举类型,我可以像这样轻松地进行迭代:

data = [res[2] 中的行对行]

我最终得到了一个列表/元组列表,它为我提供了值,但我还需要列名。我尝试了以下方法:

cols = cursor.description if cursor.description is not None else [] #Returns None
cols = res[2].description if res[2].description is not None else [] 
#Returns an error. Same if l_results is used instead

如何从 l_results 中获取列名?我已经确定 l_results 是一个 Variable 对象而不是游标,所以它不会起作用。与 res[2] 相同。但我就是无法从 curs 中获取列。

curs.description 在这之后似乎是一个 None 值,而它应该是一个 7 项元组的列表

我到底错过了什么?


编辑 1:我尝试将其从 callproc 更改为以下内容。同样的问题。

res = cursor.execute("BEGIN PROG.DATA.GET_EVENTS(:1,:2,:3); END;", {"1": 1,"2": 2,"3":, l_results})
cols = cursor.description #Returns None, again.

调用确实返回了数据,所以我不确定为什么没有设置description

最佳答案

引用游标的列可以从引用游标本身确定。给定如下过程:

create or replace procedure so50399550 (
    a_Input1            number,
    a_Input2            number,
    a_Output            out sys_refcursor
) is
begin
    open a_Output for
    select a_Input1 as num, a_Input1 * a_Input1 as square from dual
    union all
    select a_Input2, a_Input2 * a_Input2 from dual;
end;
/

Python代码可以如下:

refCursorVar = cursor.var(cx_Oracle.CURSOR)
cursor.callproc("so50399550", [1, 2, refCursorVar])
refCursor = refCursorVar.getvalue()
print("Rows:")
for row in refCursor:
    print(row)
print()
print("Column Info:")
for column in refCursor.description:
    print(column)
print()

但是,您可以使用以下代码更简单地完成此操作。您不必实际创建变量。您可以直接绑定(bind)游标。

refCursor = conn.cursor()
cursor.callproc("so50399550", [1, 2, refCursor])
print("Rows:")
for row in refCursor:
    print(row)
print()
print("Column Info:")
for column in refCursor.description:
    print(column)
print()

可以找到样本here .

关于python - 使用 cx_Oracle 从 ref 游标中检索列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50399550/

相关文章:

python - PySide:QThread 事件处理

python - ~ 运算符在 Python 中有什么作用

python - 加快 Django 表单上传大型(500k obs)CSV 文件到 MySQL 数据库

python - PYSPARK:CX_ORACLE.InterfaceError:不是查询

python - 如何在python中使用SCAN连接到Oracle-RAC?

python - Python 中的 Oracle 存储过程的命名参数

python - 按名称而不是在 cx_Oracle 中的位置获取列值

python - 使用 JSON 数据更新 Div 时遇到问题

python - 参数化 pytest 用于列表和 pandas 数据框 fixture

python - 使用python从sql查询中的文本文件调用日期