2017-02-27 98 views
1

我有一个存储过程,我使用Python脚本和Pyodbc模块调用。代码如下所示:用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

pyodbc Wiki页面[此处](https://github.com/mkleehammer/pyodbc/wiki/Calling-Stored-Procedures)显示了如何使用匿名代码块为SQL Server执行此操作。通过调整SQL语法,也许可以为Teradata使用类似的方法。 –

回答

1

作为每pyodbc包的文档,这是不可能捕捉到的存储过程的输出。这是在这里记录:https://github.com/mkleehammer/pyodbc/wiki/Calling-Stored-Procedures

pyodbc目前不实现可选的.callproc方法。

有一种解决方法,可以根据您的数据库引擎工作,即将存储过程的调用嵌入到查询中。

由于pyodbc没有.callproc我们需要使用一个解决方法来获取输出参数和返回值的值。具体方法将取决于你的特定ODBC驱动程序支持哪些ODBC驱动程序,但对于Microsoft的SQL Server的ODBC驱动程序,我们可以使用 “匿名代码块”来执行存储过程,然后SELECT 输出参数和/或返回值。

请参阅上面的链接中的详细信息。