我有一个存储过程,我使用Python脚本和Pyodbc模块调用。代码如下所示:
import pyodbc
pyodbc.pooling=False
oConnexion = pyodbc.connect("driver={Teradata};dbcname=myServer;DefaultDatabase=myDB;uid=myUser;pwd=myPassword;charset=utf8;", autocommit=True)
oConnexion.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
oConnexion.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
oConnexion.setencoding(encoding='utf-8')
oCursor = oConnexion.cursor()
oQueryRegisterBatch = "CALL DEV_AUDIT.SP_AUDIT_BATCH('ED_DATA_QUALITY_MANUAL', 'REGISTER', '1900-01-01 00:00:00.000000', '2999-12-31 00:00:00.000000');"
oCursor.execute(oQueryRegisterBatch)
for row in oCursor:
print (row)
存储过程创建一个新记录并返回记录ID(BATCH_KEY)。当我在Teradata中执行存储过程时,它会正确返回BATCH_KEY,但我无法在Python中捕获它。我得到以下错误消息而不是值:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pyodbc.ProgrammingError: No results. Previous SQL was not a query.
我可以在调用存储过程后通过查询表来检索BATCH_KEY,但我想避免。你能告诉我如何捕获存储过程的输出吗?
由于
答案 0 :(得分:2)
根据pyodbc软件包的文档,无法捕获存储过程的输出。这在此处记录:https://github.com/mkleehammer/pyodbc/wiki/Calling-Stored-Procedures
pyodbc目前没有实现可选的.callproc方法。
根据您的数据库引擎,可以使用一种解决方法,即将存储过程的调用嵌入到查询中。
因为pyodbc没有.callproc,我们需要使用解决方法 检索输出参数的值和返回值。该 具体方法取决于您的特定ODBC驱动程序 支持,但对于Microsoft的SQL Server ODBC驱动程序,我们可以使用 一个&#34;匿名代码块&#34;执行EXEC存储过程然后选择SELECT 输出参数和/或返回值。
请参阅上面链接中的详细信息。