pyodbc python linux iSeriesAccess驱动程序 - 存储过程 - 捕获输出参数?

时间:2018-02-15 13:42:56

标签: linux ibm-midrange pyodbc db2-400

我已经通过几个讨论这个问题的线程阅读了 - 但是 - 没有找到一个看起来对我的用例来说是正确的选项。

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"

1 个答案:

答案 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"