使用cx_Oracle从引用游标中检索列名

时间:2018-05-17 19:52:38

标签: python cx-oracle

在使用cx_Oracle调用简单的存储过程时,我可以轻松地从过程中获取数据,如下所示:

var description: String

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 = [row for row in res[2]]

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

此后的curs.description似乎是None值,当它应该是7项元组的列表时

我错过了什么?

编辑1:我尝试将其从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 更改为以下内容。同样的问题。

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. 没有被设置。

1 个答案:

答案 0 :(得分:2)

可以从引用游标本身确定引用游标的列。如下所示:

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()

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

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()