我有一个存储过程,我使用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,但我想避免。您能建议如何捕获存储过程的输出吗?
谢谢
根据PYODBC软件包的文档,无法捕获存储过程的输出。这在此处记录:https://github.com/mkleehammer/pyodbc/wiki/calling-stored-procedures
pyodbc当前未实现可选的.callProc方法。
有一个解决方法,可以根据您的数据库引擎来工作,该引擎将呼叫的调用嵌入到查询中。
因为pyodbc没有.callProc,我们需要使用解决方法 检索输出参数和返回值的值。这 具体方法将取决于您的特定ODBC驱动程序 支持,但是对于Microsoft的SQL Server的ODBC驱动程序,我们可以使用 执行存储过程的"匿名代码块",然后选择 输出参数和/或返回值。
请参阅上面链接中的详细信息。