使用python pyodbc捕获存储过程输出

时间:2017-02-27 03:49:42

标签: python stored-procedures output teradata 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,但我想避免。你能告诉我如何捕获存储过程的输出吗?

由于

1 个答案:

答案 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   输出参数和/或返回值。

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