Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pyodbc python linux iSeries访问驱动程序-存储过程-捕获输出参数?_Linux_Ibm Midrange_Pyodbc_Db2 400 - Fatal编程技术网

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

pyodbc python linux iSeries访问驱动程序-存储过程-捕获输出参数?,linux,ibm-midrange,pyodbc,db2-400,Linux,Ibm Midrange,Pyodbc,Db2 400,我已经阅读了几个讨论这个问题的帖子,但是没有找到一个适合我的用例的选项 Linux(RHEL 7.x) -IBM iSeries访问驱动程序 -连接到AS/400 -Python/pyodbc(ibm_db似乎不支持iSeries Access驱动程序) 对存储过程的调用——调用工作正常——数据按预期返回。问题是,这是一组已实施多年的过程,其他系统也使用了这些过程,而其他系统(即SQL Server)能够正确检索输出参数,我们发现这对pyodbc来说是一个挑战 使用一个非常基本的脚本来描述这一点

我已经阅读了几个讨论这个问题的帖子,但是没有找到一个适合我的用例的选项

Linux(RHEL 7.x)
-IBM iSeries访问驱动程序
-连接到AS/400
-Python/pyodbc(ibm_db似乎不支持iSeries Access驱动程序)

对存储过程的调用——调用工作正常——数据按预期返回。问题是,这是一组已实施多年的过程,其他系统也使用了这些过程,而其他系统(即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"

因此,PyODBC似乎没有实现
callproc
。它们确实使用了文档a来绕过某些数据库的这一限制,但这对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"
原始答案:

您需要使用而不是
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"

您是否尝试过使用类似于所述的匿名代码块?存储过程方面的代码块?如果这是所指的上下文,这是一个问题,因为我们有其他几个系统使用的过程,我们无法修改。不,只是从Python脚本执行的代码块。它不会修改在存储过程中,它调用存储过程,然后使用SELECT语句将输出参数作为单行结果集返回。我将看看是否可以使用DB2语法创建设置,该语法也通过CLP/CLI for AS400支持——目前,我还没有找到可用于DB2(i5)的匿名代码块的支持选项。返回的一般错误是pyodbc。错误:('HY000',u'[HY000][IBM][System i Access ODBC Driver]主机服务器数据流中的错误。(30187)(SQLPrepare)')失败--sql=“”\BEGIN CALL GET_MSTR_ALMSTP(23,);END”““Works---sql=“”\CALL GET_MSTR_ALMSTP(23,);”
.callproc
方法是可选的,pyodbc没有实现它。@GordThompson,你是对的。我没有意识到pyodbc没有实现输出参数支持。我已经用一种方法更新了我的答案,但是如果你没有创建全局变量的权限,它并不十分漂亮,可能不容易实现。