我已经通过几个讨论这个问题的线程阅读了 - 但是 - 没有找到一个看起来对我的用例来说是正确的选项。
Linux(RHEL 7.x)
- IBM iSeriesAccess驱动程序
- 连接到AS / 400
- Python / pyodbc(ibm_db似乎不支持iSeriesAccess驱动程序)
调用存储过程 - 调用运行良好 - 按预期返回数据。问题是这是一组已经存在了几年但也被其他系统使用的程序,而其他系统(即SQL Server)能够正确检索输出参数我们发现这是pyodbc的挑战
使用一个非常基本的脚本来描述这一点 - 结果集中只有预期的数据行 - 而不是输出参数(这是我在其他线程上看到的用于捕获输出参数的示例。
import pyodbc
connection = pyodbc.connect("dsn=DEV; UID=USER; PWD=PASSWD")
if connection:
crsr = connection.cursor()
# PARM 2 is an OUTPUT parameter type
parms = (23,0)
crsr.execute("{CALL GET_DATA(?, ?)}", parms)
rows = crsr.fetchall()
while rows:
print(rows)
if crsr.nextset():
rows = crsr.fetchall()
else:
rows = None
else:
print connection
print "error connection"
答案 0 :(得分:0)
所以看起来PyODBC没有实现callproc
。他们确实记录way来解决某些数据库的这种限制,但这对Db2不起作用。我能看到获取值的唯一方法是使用全局变量:
import pyodbc
connection = pyodbc.connect("dsn=DEV; UID=USER; PWD=PASSWD")
if connection:
crsr = connection.cursor()
crsr.execute("create or replace variable out_parm integer default 0"))
crsr.execute("call GET_DATA(?, out_parm)", (23,))
rows = crsr.fetchall()
while rows:
print(rows)
if crsr.nextset():
rows = crsr.fetchall()
else:
rows = None
crsr.execute("values(out_parm)")
print(crsr.fetchall())
else:
print connection
print "error connection"
原始答案:
您需要使用callproc代替execute
。
import pyodbc
connection = pyodbc.connect("dsn=DEV; UID=USER; PWD=PASSWD")
if connection:
crsr = connection.cursor()
# PARM 2 is an OUTPUT parameter type
parms = (23,0)
out_parms = crsr.callproc("GET_DATA", parms)
rows = crsr.fetchall()
while rows:
print(rows)
if crsr.nextset():
rows = crsr.fetchall()
else:
rows = None
else:
print connection
print "error connection"