gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:32 25 4
gpt4 key购买 nike

我已经通读了几个讨论这个话题的帖子——但是——没有找到一个似乎最适合我的用例的选项。

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"

最佳答案

看来 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"

关于linux - pyodbc python linux iSeriesAccess 驱动程序-存储过程-捕获输出参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48808714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com