使用 cx_Oracle 从引用游标中检索列名
Retrieving column names from ref cursor with 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 = [row for row in res[2]]
我最终得到一个 lists/tuples 的列表,它为我提供了值,但我还需要列名。我尝试了以下方法:
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 是一个变量对象而不是游标,所以它不起作用。与 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.
调用会处理 return 数据,所以我不确定为什么 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()
但是,您可以使用以下代码更简单地完成此操作。您不必实际创建变量。可以直接绑定游标
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。
在使用 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 = [row for row in res[2]]
我最终得到一个 lists/tuples 的列表,它为我提供了值,但我还需要列名。我尝试了以下方法:
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 是一个变量对象而不是游标,所以它不起作用。与 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.
调用会处理 return 数据,所以我不确定为什么 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()
但是,您可以使用以下代码更简单地完成此操作。您不必实际创建变量。可以直接绑定游标
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。