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

标签 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,但我想避免。您能否建议如何捕获存储过程的输出?

谢谢

最佳答案

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

pyodbc does not currently implement the optional .callproc method.

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

Because pyodbc does not have .callproc we need to use a workaround for retrieving the values of output parameters and return values. The specific method will depend on what your particular ODBC driver supports, but for Microsoft's ODBC drivers for SQL Server we can use an "anonymous code block" to EXEC the stored procedure and then SELECT the output parameters and/or return values.

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

关于python - 使用 python pyodbc 捕获存储过程输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477522/

相关文章:

sql - 如何在SQL Server存储过程中通过try catch语句得到错误 "Error converting data type nvarchar to int."?

asp.net - 用户定义的表类型的 EXECUTE 权限被拒绝?

c - 这两个代码有什么区别?

java - 如何计算带填充零的整数

python - 用户输入并陷入 while 循环

python - 比较两组结果

python - 使用 boost python 将 C 结构作为 numpy 数组传递给 python

php - 如何使用 PDO 在 PHP 中创建包含 DELIMITER 的存储过程?

C++,Odd Asci 输出与我的程序

python - Numpy 数组切片