似乎sp_newPerson()
有 5 个参数(如果我正确计算 all的话?
),但您尝试仅使用 4 个参数执行它,或者它有 4 个参数,但您又添加了一个?
:
cur.execute("{CALL sp_newPerson(?,?,?,?,?)}", (self.id, self.fname, self.lname, self.address, self.something))
或者:
cur.execute("{CALL sp_newPerson(?,?,?,?)}", (self.id, self.fname, self.lname, self.address))
编辑:
您似乎正在尝试使用带有 OUT 参数的函数或过程。
我没有 MS SQL 来检查它是否适用于 Python ODBC 准备调用。其他数据库也有问题。可能很难编写 Python ODBC 代码来获取返回值或 OUT 参数。从 C 或 Delphi ODBC 驱动程序在执行此类函数/过程之前分配缓冲区,以便可以填充它。在 Python 中,我不知道这是否可能。我发现 PreparedStatements 在 JDBC(我从 Jython 中使用)中工作,即使使用 JDBC-ODBC 桥,但 JDBC 使用专门的 API 来指定输入和输出参数。另请参阅我关于从 Oracle DB 调用函数的问题:如何通过 ODBC 检索 Oracle 数据库函数的结果?
我认为你能做的最好的就是使用解决方法。如果sp_newPerson()
是一个函数:
将其转换为SELECT
. 当函数更改数据库时(使用 INSERT、UPDATE 或 DELETE),它不能在某些数据库,尤其是 Oracle 中工作:
cur.execute("SELECT sp_newPerson(?,?,?,?)", (self.id, self.fname, self.lname, self.address))
for row in cur.fetchall():
r = row[0]
将其转换为INSERT
,当然您必须创建tmp
表,清除它等:
r = cur.execute("INSERT INTO tmp (new_person_id) VALUES (sp_newPerson(?,?,?,?))", (self.id, self.fname, self.lname, self.address))
if r == 1:
cur.execute("SELECT new_person_id FROM tmp")
for row in cur.fetchall():
r = row[0]