【问题标题】:Capture stored procedure output with python pyodbc使用 python pyodbc 捕获存储过程输出
【发布时间】:2017-07-17 13:56:10
【问题描述】:

我有一个使用 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 Wiki 页面here 展示了如何使用匿名代码块为 SQL Server 执行此操作。也许可以通过调整 SQL 语法为 Teradata 使用类似的方法。

标签: python stored-procedures output teradata pyodbc


【解决方案1】:

根据 pyodbc 包的文档,无法捕获存储过程的输出。这记录在这里:https://github.com/mkleehammer/pyodbc/wiki/Calling-Stored-Procedures

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

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

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

在上面的链接中查看详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多